【问题标题】:Session across domains in Rails 4Rails 4 中的跨域会话
【发布时间】:2015-05-22 13:52:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这是在有人登录时使用的吗?即,同一个人登录到同一个应用的各个不同域?

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


【解决方案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)了解更多详情

【讨论】:

    【解决方案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,则无需通过 get 设置奇数球变量,然后尝试在重定向时再次解释它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多