Rails 4 InvalidAuthenticityToken

时间:2014-01-21 08:09:12

标签: jquery session cookies ruby-on-rails-4

我正在使用我正在处理的应用程序遇到InvalidAuthenticityToken错误。我使用rollbar来跟踪所有错误,并在每种情况下用户发送HTTP X-Csrf-Token标头。请求是使用vanilla jQuery(使用jquery_ujs)发送的所有AJAX请求。用户经常会同时打开多个标签 - 不确定这是否与它有关。

我查看了rails中验证真实性令牌的源代码,除非会话以某种方式过期,否则我看不出它们会变为无效的原因。

任何有关我为何继续遇到此问题的想法都将不胜感激。

1 个答案:

答案 0 :(得分:3)

正如您所说,这可能是由于会话在用户在很久以前打开选项卡上触发AJAX请求之前到期。

在Rails 4中,处理未经验证的请求的默认策略是引发InvalidAuthenticityToken错误:

来自/app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
end

来自actionpack / lib / action_controller / metal / request_forgery_protection.rb:

class Exception
  def initialize(controller)
    @controller = controller
  end

  def handle_unverified_request
    raise ActionController::InvalidAuthenticityToken
  end
end

如果要防止引发错误,可以使用:null_session作为未验证的请求处理策略。

您还可以尝试增加会话超时,以查看问题是否消失或变得不那么频繁。

有关Rails 4新CSRF保护默认值的更深入解释,您可以阅读:

Forgery Protection Strategy