我有一个想要跨域使用会话(而不是子域)的问题。例如,我有.co.uk,.com.au和.com都为同一地址。
我知道子域名我可以使用类似的东西:
SomeApp::Application.config.session_store :cookie_store, key: '_some_app_session', domain => :all, :tld_length => 2
但我希望我的解决方案能够在实际域之间工作,以便拥有一组会话/ cookie。
答案 0 :(得分:2)
由于您的默认会话存储是'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 :(得分:2)
我不会使用通过?php=bad
传递:get
样式变量的PHP样式路由,特别是如果您已经在使用会话。此后,您还必须解析原始网址和其他一系列工作。
您可以使用:
,而不是使用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,它将无需通过get设置奇数球变量,然后尝试在重定向上再次解释它们。