Rails中跨域的会话4

时间:2015-03-19 12:36:19

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

我有一个想要跨域使用会话(而不是子域)的问题。例如,我有.co.uk,.com.au和.com都为同一地址。

我知道子域名我可以使用类似的东西:

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

但我希望我的解决方案能够在实际域之间工作,以便拥有一组会话/ cookie。

2 个答案:

答案 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设置奇数球变量,然后尝试在重定向上再次解释它们。