【问题标题】:How do I maintain session in Rails app with support for multiple domains?如何在支持多个域的 Rails 应用程序中维护会话?
【发布时间】:2016-12-11 05:47:07
【问题描述】:
这是场景:
我有一个 Rails 应用程序在一台机器上运行。本次讨论的应用程序是一个内容管理系统,将用于为网络中的多个站点提供服务。可以通过app.com 联系。用户应该能够为其网站设置自定义域。
我正在努力解决的是如何维护会话,以便用户只需登录网络一次。如果他们访问网络上的任何站点,则应保持他们的会话。 (从技术上讲,用户仍然在同一个站点上,只是为他们访问的站点提供了一个自定义 URL。)
如何在应用上的所有网站上为用户维护会话?
根据我所读到的关于 cookie 的内容,很难在唯一域之间共享 b/c cookie。我正在寻找的是帮助理解问题的各个部分。如果需要的话,我喜欢编写机架中间件或在应用程序前面添加其他技术。最后,我想让这些域中的每一个都可以使用 HTTPS,但现在让我们先把它放在一边。
【问题讨论】:
标签:
ruby-on-rails
session
ruby-on-rails-5
multiple-domains
【解决方案1】:
您可以通过一系列重定向转移会话。
假设您有一个域为platform.com 的应用,并且您在此平台上托管了customdomain.com 等自定义域。如问题中所述,每当用户登录 platform.com 时,他们都应该登录所有托管域。
基本思路是这样的:
- 用户登录
platform.com
- 用户在
customdomain.com 上请求页面
- 应用服务器看到来自
customdomain.com的请求,发现用户没有登录customdomain.com。
- 应用服务器重定向到
platform.com/get_session?redirect=customdomain.com
- 应用服务器重定向到
customdomain.com/set_session?login_token=<HASH>
- 应用服务器设置会话cookie以响应
set_session
瞧!!用户的会话现在从platform.com 转移到customdomain.com。
警告:这里的挑战在于应用程序何时决定重定向的细节。您需要添加逻辑以确保您不会陷入无限重定向循环。