【问题标题】:Asynchronously set rails authenticity token异步设置 Rails 真实性令牌
【发布时间】:2017-11-10 19:03:24
【问题描述】:

我有一个缓存在 CDN 级别的页面,我希望在该页面上提交表单。

我已关注technique 3 of this post 以异步获取 csrf 元标记,然后将它们发送到表单中,但当我尝试此操作时,我在表单提交控制器操作中收到 ActionController::InvalidAuthenticityToken。一切似乎都正常,但表单仍然被拒绝。

这是提供 csrf 信息的操作:

def csrf_meta
  respond_to do |format|
    format.json do
      render json: {
        param: request_forgery_protection_token,
        token: form_authenticity_token
      }
    end
  end
end

这是将它附加到<head>的JS函数

function asyncCsrf() {
  window.fetch("/async_info/csrf_meta")
  .then(function(response) {
    response.json().then(function(json) {
      console.log(json);
      var meta = document.createElement('meta');
      meta.name = "csrf-param";
      meta.content = json.param;
      document.getElementsByTagName('head')[0].appendChild(meta);
      var meta = document.createElement('meta');
      meta.name = "csrf-token";
      meta.content = json.token;
      document.getElementsByTagName('head')[0].appendChild(meta);
    });
  }).catch(function(err) {
    console.log(err);
  });
}

这是将真实性令牌添加到表单的 JS:

var authToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
// later:
<input type="hidden" name="authenticity_token" value="'+authToken+'">

一切似乎都在那里。令牌随表单一起传递,但ActionController::InvalidAuthenticityToken 仍然存在。

【问题讨论】:

  • 你能显示你正在使用的代码,而不是链接吗?
  • @maxpleaner 是的。添加了代码。我的代码与链接的东西基本相同,除了 vanilla js 而不是 jQuery。

标签: ruby-on-rails ruby ruby-on-rails-4 csrf cdn


【解决方案1】:

好吧,我解决了这个问题:由于某种原因,fetch() API 返回了错误的会话。老式的XMLHttpRequest() 工作。我认为可能标题不会自动包含在fetch 调用中,而是与XMLHttpRequest 一起使用。一旦我摆脱了这种挫败感,我会独立调查。

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2011-03-04
    • 2013-04-21
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2018-06-29
    相关资源
    最近更新 更多