【问题标题】:Share Devise session cookie between two Rails apps of different versions在两个不同版本的 Rails 应用程序之间共享设计会话 cookie
【发布时间】:2020-12-15 15:34:15
【问题描述】:
我正在尝试在同一 TLD 上但位于不同子域上的两个 Rails 应用程序之间共享一个 Devise 会话 cookie 以进行身份验证。一个应用是 v4.2.11.1,另一个是 v6.0.3.2。我想登录 Rails 4 应用程序,并在 Rails 6 应用程序中访问经过身份验证的用户信息。登录 Rails 4 应用程序时会话 cookie 设置得很好,但当尝试在 Rails 6 应用程序中访问它时,它似乎被完全清除/重置。
- 两个应用程序的会话存储 cookie 域设置正确,例如
.example.com。
- 会话存储
tld_length 在两个应用程序中都设置为2。
- cookie 序列化程序在两个应用程序中都设置为
:marshal。
- 我在两个应用程序中使用相同的
secret_key_base。在 Rails 4 应用程序中,它是通过 ENV['SECRET_KEY_BASE'] env var 设置的。在 Rails 6 应用程序中,它是通过 Rails 凭据设置的,例如config/credentials/<env>.yml.enc。
-
Devise.secret_key 在两个应用中是相同的。
- 我在两个应用程序中使用相同的 Devise gem 版本和初始化程序。
【问题讨论】:
标签:
ruby-on-rails
ruby
devise
【解决方案1】:
在您的具体情况下可能会发生其他事情,但您需要查看自 Rails 4 以来会话 cookie 发生的两个向后不兼容的更改,这是毫无价值的。
- Rails 5.2 进行了更改,将过期信息嵌入到加密的 cookie 中。来自upgrade guide:
为了提高安全性,Rails 现在还嵌入了过期信息
加密或签名的 cookie 值。
这个新的嵌入信息使这些 cookie 与
早于 5.2 的 Rails 版本。
如果您要求 5.1 及以上版本可以读取您的 cookie,或者您是
仍在验证您的 5.2 部署并希望允许您回滚设置
Rails.application.config.action_dispatch.use_authenticated_cookie_encryption
到false。
- Rails 6.0 更改了在加密 cookie 中嵌入目的。从
upgrade
guide:
为了提高安全性,Rails 将目的信息嵌入到加密中
或签名的 cookie 值。然后,Rails 可以阻止试图
复制 cookie 的签名/加密值并将其用作
另一个cookie。
这个新的嵌入信息使这些 cookie 与
早于 6.0 的 Rails 版本。
如果您要求 Rails 5.2 及更早版本可以读取您的 cookie,或者您
仍在验证您的 6.0 部署并希望能够回滚
设置Rails.application.config.action_dispatch.use_cookies_with_metadata
到false。