如何在支持多个域的 Rails 应用程序中维护会话?

How do I maintain session in Rails app with support for multiple domains?

场景如下:

我在一台机器上有一个 Rails 应用程序 运行。本次讨论的应用程序是一个内容管理系统,将用于为网络中的多个站点提供服务。可以在 app.com 到达。用户应该能够为他们的站点设置自定义域。

我正在苦苦挣扎的是如何维护会话,以便用户只需登录一次网络。如果他们访问网络上的任何站点,则应维护他们的会话。 (从技术上讲,用户仍然在同一个站点上,只是为他们访问的站点自定义 URL。)

如何在应用程序的所有站点上维护用户的会话?

根据我对 cookie 的了解,这很难 b/c cookie 不能在唯一域之间共享。我正在寻找的是帮助理解问题的各个部分。如果需要的话,我愿意编写机架中间件或在应用程序前面添加其他技术。最终,我想让这些域中的每一个都可以使用 HTTPS,但我们现在先不考虑它。

您可以通过一系列重定向来转移会话。

假设您有一个域名为 platform.com 的应用,并且您在此平台上托管自定义域名,例如 customdomain.com。如问题中所述,只要用户登录 platform.com,他们就应该登录所有托管域。

基本思路是这样的:

  1. 用户登录 platform.com
  2. 用户在 customdomain.com
  3. 上请求了一个页面
  4. 应用服务器看到来自 customdomain.com 的请求,发现用户没有登录到 customdomain.com
  5. 应用程序服务器重定向到 platform.com/get_session?redirect=customdomain.com
  6. 应用程序服务器重定向到 customdomain.com/set_session?login_token=<HASH>
  7. 应用程序服务器设置会话 cookie 以响应 set_session

瞧!!用户会话现已从 platform.com 转移到 customdomain.com

警告:这里的挑战在于应用程序何时决定重定向的细节。您需要添加逻辑以确保您不会陷入无限的重定向循环。