我一直试图让Laravel Airlock与我正在开发的新Web应用程序一起工作,但是无论我如何尝试,我都无法使其正常工作。
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上进行开发和测试。我目前仅在localhost上尝试过此操作,想知道这是否是导致问题的原因。
如果将localhost更改为http://localhost,我将不再遇到CSRF令牌不匹配的情况,但是当我检查Chrome开发者工具时,没有设置cookie。
我还读到,SPA必须与Airlock的API位于同一子域中。这是真的吗?
答案 0 :(得分:2)
经过几天的搜索,它可以和我一起工作。
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,
// ...
];