【发布时间】:2015-10-04 21:02:57
【问题描述】:
我正在尝试向 Laravel 执行 AJAX 提交。根据 Laravel 的文档here,我需要添加一个 CSRF 令牌作为请求标头和 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 标头和 _token POST 参数。
当我执行请求时,我收到此错误:
TokenMismatchException in VerifyCsrfToken.php line 46
我也尝试将令牌作为X-XSRF-TOKEN 标头传递,但我得到了同样的错误
当我设置X-XSRF-TOKEN 并省略_token POST 参数时,我遇到了不同的错误:
DecryptException in Encrypter.php line 142:
Invalid data.
我在这里缺少什么?
更新: 在进行了更多调试并将此请求与与此实现并行运行的 AngularJS 实现生成的请求进行比较后,我发现问题是我需要对 cookie 的值进行 URL 解码。
在从 cookie 中提取 csrf 令牌后,我只需要执行以下操作:
csrf_token = decodeURIComponent(csrf_token );
【问题讨论】: