Rails 为重复的 JSON 请求自动更新 CSRF 令牌

Fav*_*ene 4 security jquery json ruby-on-rails csrf

我有一个带有许多远程表单的单页 ROR 应用程序。我的问题是,在非幂等请求 Rails 更改 CSRF 令牌并使嵌入在页面元中的令牌无效之后。因此,如果页面未刷新,重复的非幂等请求将失败。

例如,当通过 POST 提交的远程表单因验证错误而失败并重新提交该表单时,它会因 InvalidAuthenticityToken 错误而失败。

我认为这个问题很常见,Rails 默认处理它,但显然不是。

Fav*_*ene 6

我对此的解决方案,这里有什么陷阱吗?:

application_controller.rb:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  # callback to set CSRF TOKEN for non-idempotent Ajax request
  after_action :add_csrf_token_to_json_request_header

  private

  def add_csrf_token_to_json_request_header
    if request.xhr? && !request.get? && protect_against_forgery?
      response.headers['X-CSRF-Token'] = form_authenticity_token
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

应用程序.js:

//= require jquery2
//= require jquery_ujs
//= require turbolinks=

$( document ).ajaxComplete(function( event, xhr, settings ) {
  header_token = xhr.getResponseHeader('X-CSRF-Token');
  if (header_token) $('meta[name=csrf-token]').attr('content', header_token)
});
Run Code Online (Sandbox Code Playgroud)