【问题标题】:Encountering "TokenMismatchException in VerifyCsrfToken.php" error在 VerifyCsrfToken.php 中遇到“TokenMismatchException”错误
【发布时间】: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 );

【问题讨论】:

    标签: laravel laravel-5 csrf


    【解决方案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()}}">
    

    【讨论】:

    • 从 cookie 中获取令牌不能解决这个问题吗?
    • 您是如何提交请求的。如果它是一个表单,那么你需要 _token 隐藏字段。如果是通过ajax,那么标题就可以了。虽然如果我没记错的话,它们不是相同的值。 cookie 有不同的值可以匹配。
    • 我正在尝试使用 jquery 执行 AJAX 提交。我将尝试省略 _token 表单字段,因为我已经在使用标题了。
    • 文档说您可以使用 cookie 值,但您发送 X-XSRF-TOKEN 而不是 X-CSRF-TOKEN
    • 我更新了我的问题,只包括抛出 X-XSRF-TOKEN 标头错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多