跨域cookies
Posted
技术标签:
【中文标题】跨域cookies【英文标题】:Cross domain cookies 【发布时间】:2010-11-08 05:16:29 【问题描述】:我有一个小问题。
如何为多个域设置 cookie?
我确实了解安全问题,并且我确信以前已经这样做过。原因是 SSO。
即。
account.domain.com
需要设置登录域:
domain.com, domain1.com, domain2.com.
是否有任何简单的方法,使用 php 和 cookie 或任何替代方法?
【问题讨论】:
这是关于 *** 的另一篇文章,展示了 facebook 如何做到这一点,是的,它可以使用 iframe 和 javascript。 ***.com/questions/4701922/… HTTP State Management Mechanism RFC6265 【参考方案1】:我认为这个解决方案会满足您的需求:“Simple Single Sign-On for PHP”
【讨论】:
【参考方案2】:您正在尝试的事情无法完成。 (这是浏览器安全问题,而不是 PHP 问题。)
除了使用某种形式的异地身份验证之外,您可以实现的最接近的方法是使 cookie 可以跨子域访问,在这种情况下,您只需使用 PHP 的 set_cookie 函数的可选“域”参数。
【讨论】:
【参考方案3】:domain.com 绝对没有办法为 domain1.com 设置 cookie。您试图做的事情只能通过让用户的浏览器向每个域提交请求来解决,然后每个域都会设置自己的 cookie。
那么你需要一种方法来为每个域验证用户的身份。有两种方法:
-
反向通道 - 站点直接相互联系以确定用户是否已登录。
在 GET 或 POST 中传递令牌 - 当用户的浏览器被重定向到其他站点时,会传递一个包含身份和会话状态的数字签名参数。
这真的很复杂。我建议你不要自己动手。查看SimpleSAMLPHP 了解我所描述的 PHP 实现。
【讨论】:
这是另一种方式,让 domain.com 与 domain1.com 连接并获取令牌,然后将该令牌传递到 JS 调用的标头中或作为单独的字段,然后 domain1.com 应检查该令牌并作出相应的回应。这有意义吗?【参考方案4】:这可以通过一个域充当主机而其他域充当从属来完成。
假设我们有一个域 accounts.domain.com,它是我们的主人。
那么我们就有了我们的奴隶domain.com
、something.com
和another.com
当您登录 domain.com 时,它实际上是站点 accounts.domain.com
,然后您将获得一个带有您浏览器唯一 ID 的 cookie,然后您将被重定向到 domain.com 的 post-登录登陆页面(即domain.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>
)。登陆页面将联系accounts.domain.com
,并使用浏览器ID进行查询。如果交易没问题,那么您将从domain.com
获得登录cookie。
接下来,将在每个域(domain.com
、something.com
和 another.com
)上初始重定向到 accounts.domain.com/roaming-check?return-url=<URL the redirect was initiated from>
。因为我们要回家了(我们已经登录accounts.domain.com
),所以我们将再次被重定向到我们的登录页面(<domain name>.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>
),从这一点开始,它与登录的部分相同。我们无缝漫游到另一个域(用户不知道它,因为浏览器通常不会显示重定向页面,直到它通过标头发送(服务器)/接收(浏览器)部分)。
如果实际上没有活动登录,该站点会将这个“否定登录”保存到会话中,并且不再尝试检查登录(直到我们尝试登录或加载另一个域)。
【讨论】:
以上是关于跨域cookies的主要内容,如果未能解决你的问题,请参考以下文章
我的第三十四篇博客---flask-cookie-sessionsqlchemary