遇到 "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()}}">