Laravel Airlock - несоответствие токенов CSRF

Я пытался заставить Laravel Airlock работать с новым веб-приложением, которое я разрабатываю, но, что бы я ни пытался, я не могу заставить его работать.

airlock.php имеет следующий набор:

'stateful' => ['https://control.domain.tld',
               'https://management.domain.tld',
               'localhost'],

cors.php имеет:

'paths' => ['api/*', 'login', 'airlock/csrf-cookie'],
'supports_credentials' => true,

В моем.env есть:

SESSION_DRIVER=cookie

session.php имеет:

'domain' => env('SESSION_DOMAIN', null),

В моем приложении Vue я запускаю этот запрос Axios, но все время получаю несоответствие токенов CSRF.

axios.get('https://controlapi-v2.domain.tld/airlock/csrf-cookie').then(response => {
   console.log(response);
});

Я безуспешно следил за всеми руководствами в Интернете. Что я мог здесь упустить?

Переменная с сохранением состояния в airlock.php имеет 3 URL-адреса, так как мое приложение будет находиться в 2 доменах и на локальном хосте для разработки и тестирования. На данный момент я пробовал это только на локальном хосте, и мне интересно, вызывает ли это проблему.

Если я изменю localhost на http://localhost/, я больше не получу несоответствие токенов CSRF, но когда я проверяю инструменты разработчика Chrome, cookie не устанавливается.

Я также читал, что SPA должен находиться в том же субдомене, что и API для работы Airlock. Это правда?

1 ответ

После нескольких дней поиска решения оно работает со мной.

import Cookies from 'js-cookie'
import axios from 'axios'

axios.defaults.withCredentials = true

axios.get('http://localhost:8000/airlock/csrf-cookie')
   .then(response => {
       Cookies.set("X-XSRF-TOKEN", Cookies.get("XSRF-TOKEN"))
       // Login...
       axios.post('http://localhost:8000/login', {
         email: 'admin@admin.com',
         password: '@admin123'
       }).then((data) => {
         console.log(data);
       })
    });

или

<?php 
namespace App\Http\Middleware; 
use Closure; 

class TransformApiHeaders  { 

    public function handle($request, Closure $next) {

        $cookie_name = 'XSRF-TOKEN'; 
        $token_cookie = $request->cookie($cookie_name); 

        if ($token_cookie !== null) { 
            $request->headers->add(["X-$cookie_name" => $token_cookie]); 
        }

        return $next($request); 
    }
}

в Kernel.php

protected $middleware = [
   TransformApiHeaders::class,
   // ...
];
Другие вопросы по тегам