提问人:j_gomes 提问时间:11/15/2023 最后编辑:j_gomes 更新时间:11/16/2023 访问量:66
Vue3 + Quasar SPA 尝试使用 Laravel API 进行身份验证并获取 CSRF 令牌不匹配(419 状态代码)[已关闭]
Vue3 + Quasar SPA trying to authenticate with a Laravel API and getting a CSRF token mismatch (419 status code) [closed]
问:
我有一个应用程序 SPA Vue3 + Quasar 和一个后端 Laravel API,在同一个域 (localhost) 上,我的 SPA 在端口 8080 上,我的 API 在端口 80 上。
在 SPA 中,每次刷新页面时,我都会向 /sanctum/csrf-cookie 发送 GET,CSRF 令牌将存储在浏览器应用程序 cookie 中。
此外,axios 在申请时正确发送 CSRF 令牌。
我尝试使用我的 Laravel API(不带 /api 前缀的 /login)进行身份验证,在开发环境中,然后我收到 419 状态代码。
我不知道是否重要,但我的 API 在 docker 容器上使用 Sails 运行。
Quasar/Vue 上的 Axios 配置:
axios.defaults.withCredentials = true;
axios.defaults.baseURL = 'http://localhost/'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
Laravel .env
...
APP_URL=http://localhost
...
SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8080
cors.php
'paths' => ['api/*', 'sanctum/csrf-cookie', 'login'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
内核.php,
'api' => [
EnsureFrontendRequestsAreStateful::class,
ThrottleRequests::class . ':api',
SubstituteBindings::class,
],
我对 /login 的请求的 Cookie 标头:
Cookie:
XSRF-TOKEN=eyJpdiI6InJ0SXhRZDVEL21JaEUvL0ptTGdmUlE9PSIsInZhbHVlIjoiU28zenNEQ1VOYTR3NXRVd1JtcU1RaUsvK1BCTHpNUGtUZ3c3T3I0d3lKQjhlZzNjMkVIeDBoOFZWanJDVkw2cWc0RGRDM0NWako0cnN1RXdveThwZkE4dW51aS9Ia1FYVXVsSlpqdW9CK1F3amJTMlFITzhpSCtudDYvY2VpUnUiLCJtYWMiOiIyODkyMzhjYjU5YzMzODY2YTkxZTY3M2MzOWZkNDkwMGQyYjBjNDg0ZTgwMzM3ZDc5NjYwYTcyNWFmZTUyZjExIiwidGFnIjoiIn0%3D; laravel_session=eyJpdiI6IlQxYXZ4WGhYZGZ5Lzk2WlF5QzJRUHc9PSIsInZhbHVlIjoidE5QQUpaeFh3WWg4cjFJNG82SXNDY1FGUmplWFN5cG5na08zazRmbXFJRFhJVWdUZS81UzJ1RWNaaC84VWxxcTFPdWNuTXd5K0pDaW0zTDliME5BSHl2ZGw4M01lbk1EUDl6SnlVWWFLM2lxNHBTOFBmei9QQXhMaTZLazJSeEEiLCJtYWMiOiIwNjFlNTFkNzIzZTIyZDhjYTg0MmVhMGViMGZjYTU4MmZjY2VmOGMyOWRjODgyNGY3NmE3NjExZDIyYWVhMDU1IiwidGFnIjoiIn0%3D; 3mcV2b1Mp2zT3MoKAWWTOeGlp0TkNFu9FneRzMLK=eyJpdiI6InY1cUYwaXhjdnZlQVRiNDNqaFRMMEE9PSIsInZhbHVlIjoiaE52dVg0dnRYdmE2dDVUT0lUUkJWeXAyaXNkaXMvZkw3RjJwT0hrbkdybUx4K0JyZ2RZV2lMYjEvT3F2TUEvOWQzejkxN05SaHlZMVliUktmUnhVRkwwYTB4cDYzUVB5VFA3MnA5SmlhMmc1Y0VSY3NyMm1JVnd2Vk1XZmFlWU05dEZJWVQrSjFqQ2h6aktFemdFVWZ6cjJBM2MydHNIMlcxRSsvWk1xaDU0Y1RDcHBFUndOL2ZlMXBVWVhyUEQrNS8vOTI5Qmx0TmpMQUtZQ0sxUHZLMEd5MnpGdC91SnVDeDJ5RkF4Tkc0dUphNHhLRFQwUE5Vc0hlR29JaVZqQ3p4Yi9wTFpMUE42UmJOWXoxN0V2bGZlZHduTVRmZUdkcHVnLzBkOWQ0emQyajhjelptSG9XUzRDb3lmZVlpMk5OK1p0R2R2eTdET2FjcTVhVGR4WmRtNVd4ekQ4SHZaeEg3cTUxY0Y2ZVhFdWhJeDh1SUkreUkwdFBmMjErUmdGIiwibWFjIjoiYWVmY2NkY2NiZmJiY2ZhNjkyMTVhODE2MTg0MjkxNTYxZWQ0N2I4NzMyY2RjOWE2NDdiNGY4NjljYjk5NDY0YyIsInRhZyI6IiJ9
编辑:
我发现了一个新观点:
Axios 添加了一个名为“Cookie”的标头,并在其中放置了 XSRF-TOKEN。 我手动添加了一个名为“X-XSRF-TOKEN”的标题,其中包含我的cookie,该cookie已存储在应用程序的Cookie中...终于奏效了。 但是我在许多教程中看到这个过程是由 Axios 自动完成的......我怎样才能做到这一点?
const login = async () => {
let cookies;
await axios.get("/sanctum/csrf-cookie").then((response) => {
const { get } = useCookies(['XSRF-TOKEN']);
cookies = get('XSRF-TOKEN');
});
axios.defaults.headers['X-XSRF-TOKEN'] = cookies;
await axios.post("/login", form).then((response) => {
console.log(response)
});
}
答:
0赞
alihardan
11/30/2023
#1
这是之后的已知问题。您必须修改 axios 配置并设置为 true,如下所示:Axios 1.6.0
withXSRFToken
axios.defaults.withCredentials = true;
axios.defaults.withXSRFToken = true;
评论