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的身份验证
解决方法
如果您可以绕过浏览器跨域屏障,则可以执行此操作.例如,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地址上的每个子域.然后,无论用户进入何处,对于每个子域,身份验证过程始终都是相同的.