我们有一个 Rails 5.2.3 应用程序正在生产中使用 Devise 4.6.2 并部署在 Heroku。该应用程序使用域 example.com,一切正常。今天我们需要将该域更改为 app.example.com(example.com 现在是一个 WordPress 站点),现在当我们尝试登录应用程序时,我们得到:
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 19ms
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
vendor/bundle/ruby/2.6.0/gems/actionpack-5.2.3/lib/action_controller/metal/request_forgery_protection.rb:211:in `handle_unverified_request'
我意识到的一件事是,现在我们的生产应用程序没有设置 session cookie。我们的暂存应用程序(使用 example.herokuapp.com 域)设置了一个名为“_myapp_session”的 cookie(并且它仍然工作正常),而在我们的生产应用程序中没有设置 cookie。 在谷歌搜索时我发现了一些对 session_store.rb 配置的提及(我们甚至没有这个文件),所以我在 config/initializers 中创建了该文件并尝试设置到我们的 app.example.com 域以及到域::所有,但它似乎没有任何区别。
Rails.application.config.session_store :cookie_store, 键: '_app_myapp_session', 域: :all
我在这里缺少什么?为什么域更改会阻止应用程序创建 session cookie? 哦,我们使用 Cloudflare 作为我们的 DNS,并且正确设置了它的 __cfduid cookie。这会相关吗?
最佳答案
所以,显然它确实与 Cloudflare 有关。我们在 Cloudflare 的 DNS 上的 app.example.com 条目被“代理”,一旦我将其设置为“仅 DNS”并等待几分钟,我们的 session cookie 又开始出现。
我刚刚意识到 Cloudflare 有自己的缓存,所以我清除了它并尝试再次使用“代理”设置,但如果这不起作用,我将把它用作 DNS。
如果有人详细说明 Cloudflare 的代理设置为何会阻止设置 cookie,请告诉我。谢谢!
关于ruby-on-rails - rails/Heroku/Cloudflare : Can't verify CSRF token authenticity after domain change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60584046/