【问题标题】:laravel shows old CSRF tokens resulting in a tokenmismatchExceptionlaravel 显示导致 tokenmismatchException 的旧 CSRF 令牌
【发布时间】:2017-07-22 18:47:54
【问题描述】:

我将 Laravel 用于需要 CSRF 令牌 进行 API 调用的项目。 我的 CSRF 元标记 sometimes 包含过期的令牌。通过刷新,最好进行 10 个新呼叫。因此,在大约 10 次刷新之后,我从 AJAX 调用中获得了 TokenMismatchException。将此 API 调用设为 CSRF 异常不是一种选择,因为该 API 调用负载很重且包含有价值的信息。

我没有自定义任何中间件类。

我在 javascript 中的 AJAX 调用如下所示:

$.ajax({
        url: '/getAllProducts',
        type: 'POST',
        data: {
            type: "gpu",
            hash: md5hash,
            _token: $('meta[name="csrf-token"]').attr('content')

        },
        dataType: 'json',
        success: function (response) {
            md5hash = '';
            products = response;
            $('.more-information').fadeIn();
            $.getScript("/js/filter-products.js", function(){
                filterProducts();
            });

            $.getScript("/js/createPopup.js", function(){
                $('.more-information').on('click', createPopup);
                $('.open-details').on('click', createPopup);
            });
        }
    });

我的路线是这样的

route::post('/getAllProducts', 'PartsController@getAllProducts');

元 csrf 令牌像标准 Laravel app.blade.php 一样生成

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

我知道还有其他关于此问题的问题,但我没有找到解决方案。我尝试了其中的几个。

这是我尝试过的解决方案列表:

  • 添加 jquery Ajaxsetup
  • 更新 laravel
  • 清除缓存

真的希望有人可以帮助我

【问题讨论】:

  • 旁注:如果您的&lt;script&gt; 位于.blade.php 文件中,则始终可以使用var _token = "{{ csrf_token() }}";,尽管最好尽可能将JS 和PHP 分开。至于为什么你会得到旧令牌;不能说。

标签: javascript ajax laravel routing csrf


【解决方案1】:

在 ajax 设置中设置令牌。

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

【讨论】:

  • 之前试过了,还是不行。看起来 Laravel 在我的页面加载后刷新了令牌。我不认为错误出在我的 javascript 中,因为它在 9/10 的时间内都有效。
  • 可能是会话超时?此代码验证 csrf-token: $sessionToken = $request->session()->token(); $token = $request->input('_token') ?: $request->header ('X-CSRF-TOKEN'); if (!$token && $header = $request->header('X-XSRF-TOKEN')) { $token = $this->encrypter->decrypt($header); }
  • 我尝试将会话生命周期从 120 更改为 86400。在加载页面后,使用相同的 CSRF 令牌进行了 8 次调用后突然更改。也许有一些选项可以防止 CSRF 令牌在会话中发生变化,你知道吗?
  • 嗯,我没听说过。如果我找到解决方案,我会写它。
猜你喜欢
  • 2016-05-08
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2012-03-25
  • 2016-12-01
  • 2017-12-09
  • 2018-10-23
相关资源
最近更新 更多