我有一个托管在domain.com上的Rails应用程序和一个安装在不同域上的引擎,使用路由配置:
Rails.application.routes.draw do
mount Some::Engine => '/', as: 'some', constraints: { domain: 'other_domain.com' }
end
有没有任何方法,无论如何破解,都可以访问两个域上的同一会话?
您的首要问题是会话基于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
- Other-domain.com重复从3开始的步骤
现在,您的所有域都在同一数据存储中存储具有相同会话id的会话数据:您正在共享会话
我倾向于说,如果你真的需要分享会话信息(而不仅仅是身份),那么你可能会给自己带来问题,但你确实说过你对任何事情都持开放态度。