【问题标题】:POST request done with Authenticity Token, but exception still rased使用 Authenticity Token 完成 POST 请求,但仍然引发异常
【发布时间】:2016-10-07 03:41:01
【问题描述】:

我的控制器正在响应一个 js GET 请求,并且在我的 js.erb 文件中,我报告了 Fingerprint2 生成的用户浏览器的浏览器数据。这是通过 POST 请求完成的,因为数据字符串很大,所以我插入了一个添加 Authenticity Token 的beforeSend 方法。

但是,这被ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken 拒绝。当我检查时,标头看起来就像在成功的 GET 请求中一样:

X-CSRF-Token:hl/TgkY7k0yBG03KX9IBrsDhk2K4tUUh8JTooT7A0yYZ0l53p8lTt0F3dZvRwyS3bIkbbkuTdElP2KisozjXjw==

js代码如下:

(new Fingerprint2).get(function(fingerprint, components) {
  return $.ajax({
    url: "/user_browser",
    type: "post",
    beforeSend: function(xhr) {
      xhr.setRequestHeader('X-CSRF-Token',
      $('meta[name="csrf-token"]').attr('content'))
    },
    data: {
      some_id: '123',
      components: JSON.stringify(components),
      fingerprint: fingerprint
    },
    dataType: "json"
  }).success(function(data) {});
});

【问题讨论】:

  • 以防万一,您确定可以从外部获取 csrf-token 并使用它,而不是为您的请求生成一个新的吗? here 它说“form_authenticity_token 生成一个有效的身份验证令牌。这在 Rails 不自动添加它的地方很有用,比如在自定义 Ajax 调用中。”
  • 我想我可以重新使用在csrf-token 属性中生成的那个。当我从type: "post" 切换到type: "get 时没有问题。
  • 从 get vs post 开始,get 请求未经过防伪验证。 here
  • 好的,您确实可以在用户会话中使用相同的 csrf-token 内容。除非您使用的是 Rails 5 per_form_csrf_token,否则这应该是所有操作的相同标记,包括。阿贾克斯来电。关于这个主题的其他问答主要是指兑现问题,即令牌被缓存(例如属于其他用户)。您是否可以使用给定的令牌手动向服务器提交发布请求以进行验证?
  • 作为一种难以调试的方法,您可以 1) 使用来自 here 的代码对您的令牌进行编码 - 例如比如this 然后 2) 调试服务器代码以找出 session[:_csrf_token] 值并手动比较

标签: ruby-on-rails ajax ruby-on-rails-4 csrf authenticity-token


【解决方案1】:

我找到了问题的根源。几天前我把我的config/session_store.rb从:

MyApp::Application.config.session_store :cookie_store, key: '_my-app_session'

到:

MyApp::Application.config.session_store :disabled

当我把它改回来时,问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2019-01-24
    • 2020-02-02
    • 1970-01-01
    • 2018-01-07
    • 2018-12-05
    • 2013-05-07
    相关资源
    最近更新 更多