我正在使用我正在处理的应用程序遇到InvalidAuthenticityToken
错误。我使用rollbar来跟踪所有错误,并在每种情况下用户发送HTTP X-Csrf-Token标头。请求是使用vanilla jQuery(使用jquery_ujs)发送的所有AJAX请求。用户经常会同时打开多个标签 - 不确定这是否与它有关。
我查看了rails中验证真实性令牌的源代码,除非会话以某种方式过期,否则我看不出它们会变为无效的原因。
任何有关我为何继续遇到此问题的想法都将不胜感激。
答案 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保护默认值的更深入解释,您可以阅读: