【问题标题】: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 发生的两个向后不兼容的更改,这是毫无价值的。

    1. 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_encryptionfalse

    1. 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_metadatafalse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多