在两个 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.com
或 example.com
设置 cookie,但不能为 .com
(浏览器有一个 list 的域名字不应该被允许)。
所有这一切都是说,如果您的两个应用程序不共享一个共同的父应用程序(就像您的情况一样),那么您将无法共享 cookie,因此您无法共享 rails 会话.
有很多方法可以解决这个问题,一种简单的方法是 CAS(中央身份验证服务)协议。基本流程是
- 用户转到 hello.com 并尝试访问某些受保护的资源(例如 /home
- 用户被重定向到
sso.example.com/service?=http://hello.com/home
- 这里像往常一样验证用户身份:用户登录,通过 cookie 识别等
- sso 服务生成一个票据(任意令牌)并将用户重定向到`http://hello.com/home?ticket=ABC123
- hello.com 的应用程序向 SSO 服务器发出(服务器端)请求,传递票证
- SSO服务器响应表明票证是否有效。如果票证有效,它还将包含一些有关用户的信息(例如电子邮件)
hello.com
设置会话 cookie,以便后续请求可以跳过步骤 2-6
有 ruby 个 cas 实现(例如 rubycas which has both a cas client and server) and devise strategies 使用 CAS。当然还有其他方法可以做到这一点,例如使用 oath,但 CAS 稍微简单一些。
我正在使用设计创建一个应用程序。有两个域名 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.com
或 example.com
设置 cookie,但不能为 .com
(浏览器有一个 list 的域名字不应该被允许)。
所有这一切都是说,如果您的两个应用程序不共享一个共同的父应用程序(就像您的情况一样),那么您将无法共享 cookie,因此您无法共享 rails 会话.
有很多方法可以解决这个问题,一种简单的方法是 CAS(中央身份验证服务)协议。基本流程是
- 用户转到 hello.com 并尝试访问某些受保护的资源(例如 /home
- 用户被重定向到
sso.example.com/service?=http://hello.com/home
- 这里像往常一样验证用户身份:用户登录,通过 cookie 识别等
- sso 服务生成一个票据(任意令牌)并将用户重定向到`http://hello.com/home?ticket=ABC123
- hello.com 的应用程序向 SSO 服务器发出(服务器端)请求,传递票证
- SSO服务器响应表明票证是否有效。如果票证有效,它还将包含一些有关用户的信息(例如电子邮件)
hello.com
设置会话 cookie,以便后续请求可以跳过步骤 2-6
有 ruby 个 cas 实现(例如 rubycas which has both a cas client and server) and devise strategies 使用 CAS。当然还有其他方法可以做到这一点,例如使用 oath,但 CAS 稍微简单一些。