【问题标题】:CSRF token issues with multiple ajax calls多个 ajax 调用的 CSRF 令牌问题
【发布时间】:2019-12-03 01:33:24
【问题描述】:

我有一个 laravel 页面,允许用户保存搜索,但前提是他们已登录。他们可以登录没有问题或保存搜索没有问题,CSRF 令牌被接受。但是,如果用户必须登录然后保存搜索,我会得到“CSRF 令牌不匹配”。错误。

我假设每个帖子或数据库更新都会生成一个新令牌,但不确定。我应该在发布到控制器之后检索新的 CSRF 令牌,然后更新页面上的 CSRF 输入吗?

我已经在我的标题中尝试过这个

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

并在我的表单中使用它

@csrf

然后在我的 ajax 调用中

var token    = $('[name=_token]').val();

令牌是在参数中传递的,所以我知道它在那里,但只会在第一个 ajax 调用中起作用

【问题讨论】:

  • 嘿@xjx424!你能分享一些你正在使用的代码吗?
  • 我已经用一些代码更新了我的问题
  • 亲爱的,谢谢!我假设您已阅读 here 关于将令牌添加到所有请求标头的内容?
  • 是的,也试过了。它每次都通过数据或标头传递相同的令牌。任何帖子后令牌值是否会发生变化?
  • 谢谢,但我已经看过那个帖子了。在过去的 4 个小时里,我可能已经看到了所有与 SO 相关的问题 :)

标签: laravel csrf


【解决方案1】:

我不确定您是如何从 ajax 获取数据的,但是您分配的 token 变量可能无法获取正确的数据。至少如果你上面的meta 是设置它的原因。

您可以尝试使用content 属性而不是val() 更改您的token 设置,如下所示(IE 测试从表单中删除并使用您在元中设置的令牌):

var token = $('meta[name="csrf-token"]').attr('content');

要检查的另一件事是如何将其放入 ajax。我发现当设置到比您的 ajax 更高的基本文件中的 ajax 标头中时效果最好 - 在当前 ajax 调用之外调用标头通常会解决您遇到的csrf mismatch 问题。

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

【讨论】:

    【解决方案2】:

    我已经解决了一个紧急支持电话!就一会儿!也许不是最好的方法,但那一次它奏效了!

    首先,我创建了一个 javascript 函数来更新令牌:

    function renewToken() {
        var csrfUrl = $("meta[name='url_page']").attr('content') + '/refresh_csrf';
    
        $.get(csrfUrl, function (data) {
            $('meta[name="csrf-token"]').attr('content', data);
        });
        return;
     }
    

    所以我创建了这条路线:

    Route::get('/refresh_csrf', function () {
        return response()->json(csrf_token());
    })->name('csrf.renew')->middleware('auth'); /* Test */
    

    因为,当令牌在每个新的 ajax 请求之前过期时,刀片仍然继续拥有旧令牌。但是,此函数用于在每次 ajax 请求之前更新令牌。

    例如:

    $(document).on('click', '.open_modal', function () {
       renewToken();
       var group_id = $(this).val();
    
       $.get(url + '/' + group_id, function (data) { ...
    

    【讨论】:

      【解决方案3】:

      原来在刷新会话的测试中留下了一行代码,这是我的愚蠢错误。

      【讨论】:

        猜你喜欢
        • 2018-12-31
        • 2014-12-29
        • 2017-01-08
        • 2011-09-28
        • 2011-07-19
        • 2014-09-25
        • 2011-06-13
        • 2014-10-06
        • 1970-01-01
        相关资源
        最近更新 更多