我有一个问题,想要跨域(而不是子域)使用会话。例如,我的.co.uk、.com.au和.com都在同一个地址。
我知道对于子域,我可以使用类似的东西:
SomeApp::Application.config.session_store :cookie_store, key: '_some_app_session', domain => :all, :tld_length => 2
但我希望我的解决方案能够在实际的域之间工作,从而拥有一组会话/cookie。
因为您的默认会话存储是'cookie_store'
您可以使用与发送带有身份验证令牌的电子邮件链接相同的方式来执行此操作。检查example.org上的cookie是否正确,如果正确,则将其重定向到:
http://example.com?token=然后检查以确保令牌在到达时与DB中的令牌匹配。如果令牌匹配,请为example.com域创建会话cookie,然后在数据库中更改令牌。
这将成功地从一个域转移到另一个域,同时在新域上提供持久登录(通过cookie),并通过更改DB中的身份验证令牌来关闭它们后面的门。
编辑
为了回答您下面的问题,我认为您不需要中间件或任何花哨的东西。你可以在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网站时将令牌附加到查询中。
转到切换到新域名(RubyonRails)时持久化用户会话的更多详细信息
我不会使用通过: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设置奇数球变量,然后在重定向时再次尝试解释它们。