不同基域上的 Rails 应用程序和引擎可以共享会话吗?
Can a Rails app and engine on different base domains share session?
我在 domain.com 上托管了一个 Rails 应用程序,并且使用此 routes 配置在不同的域上安装了一个引擎:
Rails.application.routes.draw do
mount Some::Engine => '/', as: 'some', constraints: { domain: 'other_domain.com' }
end
有什么办法,无论hacky如何,都可以访问两个域上的同一会话?
您的第一个问题是会话是基于 cookie 的,您的浏览器在向其他domain.com 发出请求时不会发送 domain.com 设置的 cookie。
如果您切换到会话存储,其中会话 cookie 仅标识某个数据存储(例如 memcached、redis 等)中的一行,那么您只需要共享此会话 ID。
我自己没有做过,但是我看到了下面的实现。
- 用户转到 example.com,没有 cookie,他们被重定向到 master-domain.com
- Master-domain.com 设置会话 cookie(例如,值为 abc-123)并重定向到 example.com/?session_id=abc-123
- example.com 设置一个具有相同值的会话 cookie(以避免在未来的请求中执行第 1 步和第 2 步)并在某些数据存储中存储针对 abc-123 的会话数据
- 稍后,用户转到 other-domain.com,没有 cookie。与 1 中一样,它们被重定向。
- 主域读取其现有会话 cookie(值为 abc-123)并重定向到 other-domain.com/?session_id=abc-123
- 其他-domain.com从3开始重复步骤
现在您的所有域都在同一数据存储中存储具有相同会话 ID 的会话数据:您正在共享会话
我倾向于说,如果你真的需要共享会话信息(而不是,例如,只是身份)那么你可能会给自己带来问题,但你确实说过你愿意任何东西。
我在 domain.com 上托管了一个 Rails 应用程序,并且使用此 routes 配置在不同的域上安装了一个引擎:
Rails.application.routes.draw do
mount Some::Engine => '/', as: 'some', constraints: { domain: 'other_domain.com' }
end
有什么办法,无论hacky如何,都可以访问两个域上的同一会话?
您的第一个问题是会话是基于 cookie 的,您的浏览器在向其他domain.com 发出请求时不会发送 domain.com 设置的 cookie。
如果您切换到会话存储,其中会话 cookie 仅标识某个数据存储(例如 memcached、redis 等)中的一行,那么您只需要共享此会话 ID。
我自己没有做过,但是我看到了下面的实现。
- 用户转到 example.com,没有 cookie,他们被重定向到 master-domain.com
- Master-domain.com 设置会话 cookie(例如,值为 abc-123)并重定向到 example.com/?session_id=abc-123
- example.com 设置一个具有相同值的会话 cookie(以避免在未来的请求中执行第 1 步和第 2 步)并在某些数据存储中存储针对 abc-123 的会话数据
- 稍后,用户转到 other-domain.com,没有 cookie。与 1 中一样,它们被重定向。
- 主域读取其现有会话 cookie(值为 abc-123)并重定向到 other-domain.com/?session_id=abc-123
- 其他-domain.com从3开始重复步骤
现在您的所有域都在同一数据存储中存储具有相同会话 ID 的会话数据:您正在共享会话
我倾向于说,如果你真的需要共享会话信息(而不是,例如,只是身份)那么你可能会给自己带来问题,但你确实说过你愿意任何东西。