Heroku/Rails/Devise: 您想要的更改被拒绝

Heroku/Rails/Devise: The change you wanted was rejected

我的 Rails 4.2 应用程序 运行 最新版本的 Devise on Heroku 出现问题。我要先说明我已经有一段时间没有将任何代码更改推送到生产环境中了,而且这个问题最近才开始出现。

当我登录时,收到一条错误消息 "The change you wanted was rejected." 当我查看日志时,我发现这是 CSRF 令牌的问题。

2015-04-04T19:52:22.430533+00:00 app[web.1]: Started POST "/users/sign_in" for 76.119.72.58 at 2015-04-04 19:52:22 +0000
2015-04-04T19:52:22.435480+00:00 app[web.1]: Completed 422 Unprocessable Entity in 1ms
2015-04-04T19:52:22.434143+00:00 app[web.1]: Processing by Devise::SessionsController#create as HTML
2015-04-04T19:52:22.434211+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"94uXDeV2wbb1XMfUL445zrIrbhS92pwe+9tWxkyvwtJhnZtZS3ydYOeP2grZvT/t2YMa2A2k/pA+U5X3gFXlAw==", "user"=>{"email"=>"test@example.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
2015-04-04T19:52:22.435112+00:00 app[web.1]: Can't verify CSRF token authenticity
2015-04-04T19:52:22.438522+00:00 app[web.1]:

我一直在 Whosebug 上搜索答案并尝试了所有我能想到的方法。到目前为止,我已经尝试了几种不同的方法:

  1. 我将这一行添加到我的 session_store.rb 中,认为这可能是 cookie 在开发和生产环境之间混合的问题。 Rails.application.config.session_store:cookie_store,键:“_abhnation_session_#{Rails.env}”

  2. 我没有 rails-api gem,some 讨论建议可能是罪魁祸首。

我还注意到这个问题完全是 Firefox 的问题,而不是特定于环境的。它发生在开发、测试和生产中。我只能通过存根会话在测试中绕过它。

我不知道是什么导致了这种情况发生。几个月来,我没有对面向 public 的生产环境进行任何更改。

代码如下link:http://github.com/danielbonnell/abhnation-rails 这是实时站点:http://abhnation.herokuapp.com/

原来问题(至少对我而言)是由 Firefox 的 Blur / DoNotTrackPlus 扩展引起的。我之前禁用了它,但没有效果。然而,当我删除它时,问题就消失了。

希望这对以后的人有所帮助。

更新设置以允许 iOS Safari 浏览器中的 cookie。

我的 iOS iPhone Safari 上也收到了同样的消息,但是一旦我允许 IOS safari 使用 cookie,问题就解决了。

您还可以检查您的 cookie 域 - 确保它设置为正确的 *.herokuapp.com 域。

这对我来说是 Cloudflare 的问题。我在查看错误时错过了以下日志行:

HTTP Origin header (https://test-app.my.app) didn't match request.base_url (http://test-app.my.app)

我为我的域启用了灵活的 SSL 模式。这需要设置为 Full SSL 以确保在 Cloudflare 与您的应用程序通信时强制 https://

我在搜索“你想要的更改被拒绝”错误消息时遇到了你的post,我一直断断续续,但似乎从未真正理解导致它的原因在我们的系统上。事实证明,当用户在多个选项卡中打开我们的应用程序并且用户会话超时时,就会发生这种情况。他会在多个选项卡中获得一个新的登录页面。然后,当他登录到第一个选项卡并尝试在第二个选项卡上执行相同操作时,第二次登录将失败,因为 CSRF 令牌与当前活动会话不匹配。应用 here 描述的解决方案可以优雅地为我们解决问题:

rescue_from ActionController::InvalidAuthenticityToken do |_exception|
  flash[:alert] = 'Please try again.'
  redirect_back fallback_location: root_path
end