遇到 "TokenMismatchException in VerifyCsrfToken.php" 错误
Encountering "TokenMismatchException in VerifyCsrfToken.php" error
我正在尝试向 Laravel 执行 AJAX 提交。根据 Laravel 的文档 here,我需要添加一个 CSRF 令牌作为请求 header 和 POST 参数。我正在从 XSRF-TOKEN
cookie 中检索 CSRF 令牌,如文档中所述:
// Grab XSRF cookie.
var csrf_token;
var cookies = document.cookie.split(';');
for(cookie_offset in cookies) {
var cookie_parts = cookies[cookie_offset].split('=');
if(cookie_parts[0].trim() === 'XSRF-TOKEN') {
csrf_token = cookie_parts[1].trim();
}
}
这将检索类似于以下内容的令牌:
eyJpdiI6Ik96QTdtcFIzam85TGJNQ3pzNUF1blE9PSIsInZhbHVlIjoiQm8zelBSaFpaM0JZcjlxcURFVEZNenZWMzNxUHFBMm1VVzM3YXpBbjVvaTBReEY5cFA1RGV3UVBHQWhjVGhZYmtDZ2lacGxFejJwQkxHaGplV1wvVEtRPT0iLCJtYWMiOiI3NTlkZmI5ODU2YTdlN2RiYTA1YTAyM2NiZmZlOWUwZTQyY2I0NTUzOWEyNzI5YjE2ODIyMmU1YzZiNDE1MmQ0In0
获得令牌后,我将其添加为 X-CSRF-Token
header 和 _token
POST 参数。
当我执行请求时,我收到此错误:
TokenMismatchException in VerifyCsrfToken.php line 46
我也尝试过将令牌作为 X-XSRF-TOKEN
header 传递,但我遇到了同样的错误
当我设置 X-XSRF-TOKEN
并省略 _token
POST 参数时,我遇到了不同的错误:
DecryptException in Encrypter.php line 142:
Invalid data.
我在这里缺少什么?
更新:
经过更多调试并将此请求与 运行 side-by-side 实现生成的请求进行比较后,我发现问题是我需要 URL 解码cookie 的值。
从 cookie 中提取 csrf 令牌后,我只需要执行以下操作:
csrf_token = decodeURIComponent(csrf_token );
您将令牌添加到客户的请求中 AJAX 或作为表单中的隐藏字段。您必须添加一种方式让客户端知道令牌是什么。一种方法是使用基本视图中的令牌元标记:
<meta name="xsrf-token" content="{{Session::token()}}" />
然后在您的 javascript 端,对于任何 ajax 请求,您可以执行以下操作:
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-Token':$('meta[name="xsrf-token"]).attr('content')
}
});
}
否则当你 post 你可以在隐藏字段中使用 CSRF 令牌
因此:
<input type="hidden" name="_token" value="{{Session::token()}}">
我正在尝试向 Laravel 执行 AJAX 提交。根据 Laravel 的文档 here,我需要添加一个 CSRF 令牌作为请求 header 和 POST 参数。我正在从 XSRF-TOKEN
cookie 中检索 CSRF 令牌,如文档中所述:
// Grab XSRF cookie.
var csrf_token;
var cookies = document.cookie.split(';');
for(cookie_offset in cookies) {
var cookie_parts = cookies[cookie_offset].split('=');
if(cookie_parts[0].trim() === 'XSRF-TOKEN') {
csrf_token = cookie_parts[1].trim();
}
}
这将检索类似于以下内容的令牌:
eyJpdiI6Ik96QTdtcFIzam85TGJNQ3pzNUF1blE9PSIsInZhbHVlIjoiQm8zelBSaFpaM0JZcjlxcURFVEZNenZWMzNxUHFBMm1VVzM3YXpBbjVvaTBReEY5cFA1RGV3UVBHQWhjVGhZYmtDZ2lacGxFejJwQkxHaGplV1wvVEtRPT0iLCJtYWMiOiI3NTlkZmI5ODU2YTdlN2RiYTA1YTAyM2NiZmZlOWUwZTQyY2I0NTUzOWEyNzI5YjE2ODIyMmU1YzZiNDE1MmQ0In0
获得令牌后,我将其添加为 X-CSRF-Token
header 和 _token
POST 参数。
当我执行请求时,我收到此错误:
TokenMismatchException in VerifyCsrfToken.php line 46
我也尝试过将令牌作为 X-XSRF-TOKEN
header 传递,但我遇到了同样的错误
当我设置 X-XSRF-TOKEN
并省略 _token
POST 参数时,我遇到了不同的错误:
DecryptException in Encrypter.php line 142:
Invalid data.
我在这里缺少什么?
更新: 经过更多调试并将此请求与 运行 side-by-side 实现生成的请求进行比较后,我发现问题是我需要 URL 解码cookie 的值。
从 cookie 中提取 csrf 令牌后,我只需要执行以下操作:
csrf_token = decodeURIComponent(csrf_token );
您将令牌添加到客户的请求中 AJAX 或作为表单中的隐藏字段。您必须添加一种方式让客户端知道令牌是什么。一种方法是使用基本视图中的令牌元标记:
<meta name="xsrf-token" content="{{Session::token()}}" />
然后在您的 javascript 端,对于任何 ajax 请求,您可以执行以下操作:
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-Token':$('meta[name="xsrf-token"]).attr('content')
}
});
}
否则当你 post 你可以在隐藏字段中使用 CSRF 令牌 因此:
<input type="hidden" name="_token" value="{{Session::token()}}">