ActionController::InvalidAuthenticityToken Rails 5 / 设计 / 审核 / PaperTrail gem

ActionController::InvalidAuthenticityToken Rails 5 / Devise / Audited / PaperTrail gem

背景详情

我正在使用 Devise 进行身份验证以登录 Rails 5 应用程序。

每当我捆绑 AuditedPaper Trail gem 时,当我尝试#create 一个新会话时(通过登录表单 - /users/sign_in),我收到以下错误:

ActionController::InvalidAuthenticityToken

环境详细信息

Ruby 2.3.1

宝石:

重现步骤:

  1. 创建Rails 5个申请
  2. 添加设计gem
  3. 添加审计或书面记录gem
  4. 尝试登录

事实证明,Devise documentation 就此错误而言非常具有启发性:

For Rails 5, note that protect_from_forgery is no longer prepended to the before_action chain, so if you have set authenticate_user before protect_from_forgery, your request will result in "Can't verify CSRF token authenticity." To resolve this, either change the order in which you call them, or use protect_from_forgery prepend: true.

解决方法是更改​​我的应用程序控制器中的代码:

 protect_from_forgery with: :exception

为此:

 protect_from_forgery prepend: true

直到我尝试添加 Audited 或 Paper Trail gem 后,这个问题才出现。

在我的项目中我们遇到了这个问题,我们无法覆盖 protect_from_forgery。 所建立的解决方案表明 github 经过审核并为我工作。

将其放入 gemfile 中:

gem "audited", github: "collectiveidea/audited"

documentation所述。

For Rails 5, note that protect_from_forgery is no longer prepended to the before_action chain, so if you have set authenticate_user before protect_from_forgery, your request will result in "Can't verify CSRF token authenticity." To resolve this, either change the order in which you call them, or use protect_from_forgery prepend: true.

我用过类似的东西,它对我有用。

class WelcomeController < ::Base
    protect_from_forgery with: :exception
    before_action :authenticate_model!
end

我的解决方案是手动转到我的浏览器设置并删除缓存。

这发生在我的开发机器上。结果我设置了

Rails.application.config.session_store

出于生产中的安全目的。不知何故,这段代码在开发模式下得到了运行。我必须注释掉这一行,它现在工作正常。

Rails.application.config.session_store :cookie_store, key: '_my_session', secure: true, same_site: :strict

任何人 运行 可以尝试的另一件事是将以下内容添加到您的环境配置文件中:

config.action_controller.forgery_protection_origin_check = false

对我来说,生产工作正常,但暂存和开发工作不正常,这为我解决了这个问题。