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,
// ...
];