我正在尝试向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实现生成的请求进行比较之后,我发现问题是我需要URL解码cookie的值。
从cookies中提取csrf令牌后,我只需要执行以下操作:
csrf_token = decodeURIComponent(csrf_token );
答案 0 :(得分:1)
您可以将令牌添加到客户端的请求中,无论是AJAX还是表单中的隐藏字段。您必须为客户端添加一种知道令牌的方法。一种方法是使用基本视图中的标记元标记:
<meta name="xsrf-token" content="{{Session::token()}}" />
然后在你的javascript端,你可以做任何ajax请求:
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-Token':$('meta[name="xsrf-token"]).attr('content')
}
});
}
否则,当您发布时,您可以在隐藏字段中使用CSRF令牌 如此:
<input type="hidden" name="_token" value="{{Session::token()}}">