【问题标题】:Rails Ajax Can't verify CSRF token AuthenticityRails Ajax 无法验证 CSRF 令牌的真实性
【发布时间】:2023-03-26 12:10:02
【问题描述】:

在我的 rails 应用程序中,我在 api 的 ajax 帖子上收到“警告:无法验证 CSRF 令牌真实性”。

app/views/layouts/application.html.haml

!!!
%html
  %head
    = stylesheet_link_tag "application", :media => "all"
    = javascript_include_tag "application"
    = csrf_meta_tags
  %body
    = yield

ajax 帖子

$.ajax({ url: '#{card_credits_path}',
 type: 'POST',
 beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', '#{form_authenticity_token}')},
 dataType: "json",
 data: { credit_uri: response.data.uri,
         email: $('#email:hidden').val(),
         name: $('.name').val()
       },
success: function(randomobject) {
   window.location = '/';
   },
error: function(){
   console.log("Card information is wrong!");
   }
});

【问题讨论】:

  • 你验证form_authenticity_token的内容了吗?内容是什么?
  • 不,我没有,我不确定该怎么做。让我看看我能做什么。
  • 不需要...您可以从相应的元标记中提取令牌值。我已经发布了一个解决方案来演示如何做到这一点。

标签: jquery ruby-on-rails ruby ajax


【解决方案1】:

假设你已经使用 Rails csrf_meta_tag 标签设置了 CSRF 令牌,那么请求的令牌将在 csrf-token 元标签中可用:

<meta content="u-n-i-q-u-e-t-o-k-e-n" name="csrf-token" />

由于您使用的是 jQuery,因此您可以通过为 beforeSend 键调用以下值来将令牌传递给您的 AJAX 请求:

function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}

【讨论】:

    【解决方案2】:

    此代码已经存在于rails/jquery-ujs 中,因此使用它要容易得多:

     beforeSend: $.rails.CSRFProtection
    

    【讨论】:

    • 我做 Rails 开发人员近 10 年了,不知道这是一回事。
    猜你喜欢
    • 2017-07-15
    • 2015-07-24
    • 2014-06-16
    • 2012-05-08
    • 2015-12-29
    • 2016-09-17
    • 2012-12-11
    • 2019-07-15
    • 2014-07-04
    相关资源
    最近更新 更多