在两个 Rails4 应用程序之间共享会话

Share session between two rails4 applications

我正在使用设计创建一个应用程序。有两个域名 1) www.test.com 和 2) www.hello.com 两个域都指向同一个应用程序。所以我想在两个应用程序之间共享会话(current_user)。用户将登录 (1),它应该访问域 (2)。

请建议最好的方法。

Rails 维护在每次 HTTP 请求期间传递到服务器的 cookie。请检查您的网络日志

下的请求headers

你会看到这样的东西

Cookie: some-junk-looking-session-data

因此,在两个完全不同的 rails 应用程序之间共享 session 是一个安全问题,rails 不允许这种行为。

但是,有一个例外。如果只是 TLD 更改,则可以共享 session。例如:hello.com & hello.org.

YourApp::Application.config.session_store :cookie_store,
  key: '_app_session',
  domain: :all

参考文献:

https://github.com/rails/rails/commit/1091a6e9b700bd713c8a6818761a27aa72b1fe93

这里的基本问题是 cookie 的工作方式(会话当然依赖于它)。 cookie 有域属性,浏览器只发送域与请求主机匹配的 cookie(域开头的句号的含义有点微妙)

此外,在设置 cookie 时,浏览器将只接受作为当前域的父域且不是 public 域的域。例如,如果您收到来自 www.example.com 的响应,它可以为 www.example.comexample.com 设置 cookie,但不能为 .com(浏览器有一个 list 的域名字不应该被允许)。

所有这一切都是说,如果您的两个应用程序不共享一个共同的父应用程序(就像您的情况一样),那么您将无法共享 cookie,因此您无法共享 rails 会话.

有很多方法可以解决这个问题,一种简单的方法是 CAS(中央身份验证服务)协议。基本流程是

  1. 用户转到 hello.com 并尝试访问某些受保护的资源(例如 /home
  2. 用户被重定向到 sso.example.com/service?=http://hello.com/home
  3. 这里像往常一样验证用户身份:用户登录,通过 cookie 识别等
  4. sso 服务生成一个票据(任意令牌)并将用户重定向到`http://hello.com/home?ticket=ABC123
  5. hello.com 的应用程序向 SSO 服务器发出(服务器端)请求,传递票证
  6. SSO服务器响应表明票证是否有效。如果票证有效,它还将包含一些有关用户的信息(例如电子邮件)
  7. hello.com 设置会话 cookie,以便后续请求可以跳过步骤 2-6

有 ruby 个 cas 实现(例如 rubycas which has both a cas client and server) and devise strategies 使用 CAS。当然还有其他方法可以做到这一点,例如使用 oath,但 CAS 稍微简单一些。