可以在不同基域上的Rails应用和引擎共享会话吗?

时间:2015-04-17 11:06:50

标签: ruby-on-rails-4 cross-domain

我在domain.com上托管了一个Rails应用,并使用此路由配置在不同的域上安装了引擎:

Rails.application.routes.draw do
  mount Some::Engine => '/', as: 'some', constraints: { domain: 'other_domain.com' }
end

有没有办法,无论 hacky 如何在两个域上访问同一个会话?

1 个答案:

答案 0 :(得分:1)

您的首要问题是会话基于Cookie,而您的浏览器在向otherdomain.com提出请求时,不会发送domain.com设置的Cookie。

如果切换到会话存储区,其中会话cookie只标识某个数据存储中的行(例如memcached,redis等),那么您只需要共享此会话ID。

我自己没有这样做,但我已经看到以下实施。

  1. 用户访问example.com,没有cookie,他们被重定向到master-domain.com
  2. Master-domain.com设置会话cookie(例如,值为abc-123)并重定向到example.com/?session_id=abc-123
  3. example.com设置具有相同值的会话cookie(以避免未来请求中的步骤1和2)并将会话数据存储在某些数据存储中的abc-123
  4. 稍后,用户访问other-domain.com,没有cookie。与1中一样,它们被重定向。
  5. 主域名读取其现有会话Cookie(值为abc-123)并重定向至other-domain.com/?session_id=abc-123
  6. Other-domain.com重复3的步骤。
  7. 现在,您的所有域都在相同的数据存储中存储具有相同会话ID的会话数据:您正在共享会话

    我倾向于说,如果你真的需要分享会话信息(例如,只是身份),那么你可能会为自己创造问题,但你确实说过你对任何事情都持开放态度。