在VerifyCsrfToken.php中遇到" TokenMismatchException"错误

时间:2015-07-15 17:15:17

标签: laravel laravel-5 csrf

我正在尝试向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 );

1 个答案:

答案 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()}}">