Rails 4中跨域会话问题

6

我希望跨域名(而不是子域名)使用会话。例如,我有.co.uk、.com.au和.com三个域名,它们都指向同一个地址。

对于子域名,我知道可以使用以下方法:

SomeApp::Application.config.session_store :cookie_store, key: '_some_app_session', domain => :all, :tld_length => 2

但我希望我的解决方案能够在不同的域之间运行,以便拥有一个共享的会话/cookie 集合。


这是针对已登录的用户吗?也就是说,同一人登录到同一个应用程序的不同域名下? - Max Williams
2个回答

2
由于您的默认会话存储是“cookie_store”,因此您可以像发送带有身份验证令牌的电子邮件链接时一样进行操作。检查在example.org上cookie是否正确,如果正确,则将其重定向到: http://example.com?token= 然后在他们到达时检查令牌是否与您在数据库中拥有的令牌匹配。如果令牌匹配,则为example.com域创建会话cookie,然后更改数据库中的令牌。
这将成功地从一个域转移到另一个域,同时通过在数据库中更改身份验证令牌来提供新域上的持久登录(通过cookie)并关闭它们的大门。
编辑
为了回答您下面的问题,我认为您不需要中间件或任何高级功能。您可以在example.org的应用程序控制器中进行简单的before过滤器,例如:
before_filter :redirect_to_dot_com
...
def redirect_to_dot_com
  url = "http://example.com" + request.fullpath
  url= destination + (url.include?('?') ? '&' : '?') + "token=#{current_user.token}" if signed_in?
  redirect_to url, status: 301
end

这将重定向用户,如果用户在 .org 网站上已登录,则会将令牌附加到查询中。
请前往切换到新域名时保持用户会话(Ruby on Rails)以获取更多详细信息。

2

如果你已经使用会话,我不会使用通过:get传递?php=bad风格变量的PHP样式路由,因为这样做需要解析原始URL和大量其他工作。

相反,你可以使用session[:edition_id] = 'UK'代替:

cookies[:edition_id] = { value: 'UK', domain: 'some-app.com', expires: 1.year.from_now } 

# or if you want to be google 10.years.from_now

当您使用session[:edition_id] = 'UK'时,该值将由rails加密并存储在_myapp_session cookie中。但在您的情况下,这可能并不重要。
如果您明确在要从中读取cookie的域上设置cookie,则无需通过get设置奇怪的变量,然后尝试在重定向时再次解释它们,即可正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接