【问题标题】:Heroku/Rails/Devise: The change you wanted was rejectedHeroku/Rails/Devise:你想要的改变被拒绝了
【发布时间】:2015-06-09 16:11:07
【问题描述】:

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

当我登录时,我收到一条错误消息,提示“您想要的更改被拒绝”。当我查看日志时,我可以看到这是 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]:

我一直在寻找 StackOverflow 的答案,并尝试了我能想到的一切。到目前为止,我已经尝试了一些不同的方法:

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

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

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

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

这里是代码链接:http://github.com/danielbonnell/abhnation-rails 这是现场直播:http://abhnation.herokuapp.com/

【问题讨论】:

    标签: ruby-on-rails heroku devise csrf


    【解决方案1】:

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

    希望这对将来的人有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          这对我来说是 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://

          【讨论】:

          • 刚刚在 Cloudflare 上遇到了同样的问题。感谢分享!
          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-07
            • 2021-09-26
            • 1970-01-01
            • 2012-05-27
            • 1970-01-01
            • 1970-01-01
            • 2012-07-25
            相关资源
            最近更新 更多