ruby-on-rails-3 – 在Rails 3中跨子域共享登录会话的正确方法?

我在互联网上发现的有关此内容的所有信息均表示使用类似的内容
Login::Application.config.session_store :cookie_store,:key => '_login_session',:domain => '.domain.com'

并对我要共享该会话的所有子域使用相同的密钥.当我这样做时,不在子域之间传递身份验证.实际上,当我访问任何所谓的共享会话时,初始会话将被覆盖

即在login.domain.com上,我运行身份验证,返回用户名和会话user_id.然后我去sub.domain.com,它应该返回与login.domain.com相同的信息,但不会.在此之后,我回到login.domain.com,我也不再在那里进行身份验证.

在sub.domain.com上,session_store.rb文件如下所示:

Something::Application.config.session_store :cookie_store,:domain => '.domain.com'

我用过:所有的:域值,也有相同的结果.如果我删除上面的:域设置,那么初始会话不会被覆盖,但它也不会被共享.

当我在Firefox的Cookie编辑器中查看Cookie时,两个子域都使用相同的Cookie名称,但未共享身份验证.这是一个非常基本的Users表,我使用OpenID和OAuth来执行Omniauth的身份验证

解决方法

更新:建议的解决方案并不是那么丑陋,广告交易平台和DSP / ssp使用相同的技术来交换访问者的会话ID,以便他们可以更好地使用广告定位访问者(下次访问者再次在其网络中弹出) )

如果您可以绕过浏览器跨域屏障,则可以执行此操作.例如,JSONP专门为此目的而构建.是的,会话信息始终集中存储,否则如果您收到会话ID为“zigzag”的请求,您如何检查它是否有效?

在login.domain.com上进行身份验证的“那些”站点可能使用ajax代理,或使用其他方法解决跨域问题.

最古老的“技巧”是在应用程序中创建一个看起来像图像的钩子,因为图像可以从任何地方加载.

例如,在login.domain.com上,您对用户进行身份验证,发送到服务器并返回响应,并且cookie将存储在login.domain.com下,并带有会话ID(也存储在服务器中) .然后 – 从Javascript – 你得到一个图像,附加会话ID,如http://any.domain.com/path/image.jpg?sessionID=abcd – >在响应中发回的任何cookie都将存储在any.domain.com下

一个解决方案 – 与之前一样丑陋 – 是使用隐藏的iframe来调用any.domain.com(当成功的身份验证发生时),该请求将返回响应,其cookie将写在any之下. domain.com域名.

如果您有多个子域,并且您可以稍微复杂一点,我强烈建议您创建一个代理,并使其可用于同一IP地址上的每个子域.然后,无论用户进入何处,对于每个子域,身份验证过程始终都是相同的.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...