【问题标题】:Laravel TokenMismatch Exception when sending token in header在标头中发送令牌时,Laravel TokenMismatch Exception
【发布时间】:2018-11-27 06:25:30
【问题描述】:

我在发出 ajax 请求时在标头中发送 CSRF 令牌。

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': getCookie("XSRF-TOKEN")
    }
});

在上面的代码中,我从“XSRF-TOKEN”cookie 中获取令牌,并为所有 ajax 请求全局设置“X-CSRF_TOKEN”标头。

我已经在 chrome 开发者工具中检查了这个标头正在被发送。

但是 Laravel 仍然会抛出 TokenMismatch 异常。

注意我无法从 html 中获取令牌,例如元标记或输入字段,因为正在缓存 html 内容,因此我想设置使用 laravel 在每个响应中设置的“XSRF-TOKEN”cookie。

【问题讨论】:

    标签: php laravel cookies laravel-5.3 csrf-protection


    【解决方案1】:

    Laravel的csrf_token()生成的token和cookie中设置的不一样。

    现在的问题是“X-CSRF-TOKEN”标头用于发送csrf_token()函数生成的令牌。

    因此,如果您想发送从 cookie 获得的 csrf 令牌,您应该使用“X-XSRF-TOKEN”标头。

    因此上面的代码应该是这样的

    $.ajaxSetup({
        headers: {
            'X-XSRF-TOKEN': getCookie("XSRF-TOKEN")
        }
    });
    

    【讨论】:

      【解决方案2】:

      尝试这样做: https://laravel.com/docs/5.3/csrf#csrf-x-csrf-token

      将此添加到您的刀片文件中的<head></head>

      <meta name="csrf-token" content="{{ csrf_token() }}">
      

      在你的 JS 中得到这样的令牌:

      $.ajaxSetup({
          headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').val()
          }
      });
      

      -- 编辑--

      如果您不想使用 meta 标记,可以使用输入字段,并将其放入您的 &lt;body&gt;&lt;/body&gt;

      <input type="hidden" name="csrf-token" value="{{ csrf_token() }}">
      
      'X-CSRF-TOKEN': $('input[name="csrf-token"]').val()
      

      【讨论】:

      • 由于某种原因,我无法使用元标记获取 csrf 令牌
      【解决方案3】:

      我也遇到了像你这样的问题;也许这个答案会有所帮助..看起来您的 csrf 令牌已更新:https://stackoverflow.com/a/43893114/5586645

      【讨论】:

        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 2021-05-05
        • 2017-12-02
        • 2021-08-11
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多