ruby-on-rails - rails/Heroku/Cloudflare : Can't verify CSRF token authenticity after domain change

标签 ruby-on-rails heroku session-cookies csrf cloudflare

我们有一个 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/

相关文章:

ruby-on-rails - 将 JSON 转换回 ActiveRecord

node.js - Heroku 构建在 package.json 文件中找不到 `@types`

javascript - 如何注销打开的浏览器窗口

ruby-on-rails - 我如何在 Jbuilder 中使用 Rails 助手和 Gon gem?

ruby-on-rails - 从 UBUNTU 14.0.4 LTS 卸载 Ruby 时出错

ruby-on-rails - Rails 6 应用程序在测试期间未在 Heroku 上读取 ENV

node.js - 使用 nodemailer 发送电子邮件在 Heroku 上失败

firefox - 如何制作在 Firefox session 中使用的 cookie?

php - Laravel 5.1 中 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException

ruby-on-rails - 在 Rails 4 应用程序中使用 MySQL 和 Postgres