2015-03-19 71 views
4

我想要跨域(而不是子域)使用会话时遇到问题。例如,我有.co.uk,.com.au和.com全部用于相同的地址。跨Rails 4中的域的会话

我知道子域,我可以使用类似:

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

但我想我的解决方案之间实际域有一组会话/饼干的工作。

+0

这是为什么当有人登录?也就是说,同一个人登录同一应用程序的各个不同的域名? – 2015-03-19 13:02:56

回答

1

为默认的会话存储为“cookie_store”

你可以做它的方式时,可能会发送电子邮件链接以验证令牌相同。检查以验证example.org上的cookie是否正确,如果是,将它重定向到:

http://example.com?token= 然后检查以确保令牌与数据库中到达的令牌相匹配。如果令牌不匹配,则为example.com域创建会话cookie,然后更改数据库中的令牌。

这将成功从一个域转移到另一个域,同时通过更改数据库中的身份验证令牌提供新域(通过cookie)的持久登录并关闭它们后面的门。

编辑

下面来回答你的问题,我不认为你需要中间件或任何幻想。你可以在example.org的应用控制器滤波器之前做一个简单的,是这样的:

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网站。

转到更多细节Persisting user sessions when switching to a new domain name (Ruby on Rails)

1

我不会用PHP的风格路线,其特别是如果你已经在使用会议通过:get通过?php=bad风格变量。此后,您还必须解析原始网址和其他一些工作。

而不是使用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'值将由轨道被加密并存储在_myapp_session饼干。但在你的情况下,这可能并不重要。

如果你明确地在要读取的域上设置cookie,它将工作,而不必通过get设置奇数球变量,然后尝试在重定向时再次解释它们。