Laravel + Vue.js (axios) - CSRF 令牌不匹配
Laravel + Vue.js (axios) - CSRF token mismatch
我在 Laravel 中遇到 csrf 令牌问题。有时请求 POST(通过 axios)returns 419 代码 "CSRF token mismatch" 但请求 header 包含 CSRF 和 XSRF 令牌。有趣的是,它不会在隐身模式下发生。
App.blade:
<meta name="csrf-token" content="{{ csrf_token() }}">
bootstrap.js:
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
Kernel.php:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class,
],
我尝试清除缓存和配置,但没有结果。有什么解决办法吗?
有时候?!听起来像 expired token
.
当您在 incognito tabs
工作时,您有一个新的令牌。
当你得到 419 error code
时尝试 location.reload()
,一切顺利。
我遇到了这个问题。原因是 axios headers 没有被设置。将它们设置在组件内的轴 object 上也没有解决问题。在 object 定义后设置 headers 解决了我的问题。
在您的 blade 视图中添加以下内容:
<script>window.Laravel = {csrfToken: '{{ csrf_token() }}'}</script>
在您的 bootstrap.js 文件中,声明 window.axios = require('axios');
后添加以下内容:
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = window.Laravel.csrfToken;
我认为您的令牌已过期。您可以拦截 http 状态 419(Laravel 定义的非标准状态)并重新加载页面以生成新的 CSRF 令牌:
window.axios.interceptors.response.use(
response => response.data,
error => {
if (error.response && 419 === error.response.status) {
window.location.reload()
}
return Promise.reject(error)
}
)
我在从另一个网站 (webB) 的 laravel 数据库 (webA) 获取数据时遇到问题。
经过一些研究,我发现 Laravel 已经有一个针对这种情况的解决方案: https://laravel.com/docs/5.7/csrf 排除您从另一个网站访问的路由。在 VerifyCsrfToken.php 中,排除路由或页面。
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}
我在 Laravel 中遇到 csrf 令牌问题。有时请求 POST(通过 axios)returns 419 代码 "CSRF token mismatch" 但请求 header 包含 CSRF 和 XSRF 令牌。有趣的是,它不会在隐身模式下发生。
App.blade:
<meta name="csrf-token" content="{{ csrf_token() }}">
bootstrap.js:
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
Kernel.php:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class,
],
我尝试清除缓存和配置,但没有结果。有什么解决办法吗?
有时候?!听起来像 expired token
.
当您在 incognito tabs
工作时,您有一个新的令牌。
当你得到 419 error code
时尝试 location.reload()
,一切顺利。
我遇到了这个问题。原因是 axios headers 没有被设置。将它们设置在组件内的轴 object 上也没有解决问题。在 object 定义后设置 headers 解决了我的问题。
在您的 blade 视图中添加以下内容:
<script>window.Laravel = {csrfToken: '{{ csrf_token() }}'}</script>
在您的 bootstrap.js 文件中,声明 window.axios = require('axios');
后添加以下内容:
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = window.Laravel.csrfToken;
我认为您的令牌已过期。您可以拦截 http 状态 419(Laravel 定义的非标准状态)并重新加载页面以生成新的 CSRF 令牌:
window.axios.interceptors.response.use(
response => response.data,
error => {
if (error.response && 419 === error.response.status) {
window.location.reload()
}
return Promise.reject(error)
}
)
我在从另一个网站 (webB) 的 laravel 数据库 (webA) 获取数据时遇到问题。 经过一些研究,我发现 Laravel 已经有一个针对这种情况的解决方案: https://laravel.com/docs/5.7/csrf 排除您从另一个网站访问的路由。在 VerifyCsrfToken.php 中,排除路由或页面。
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}