跨域Cookies

27

我有一个小问题。

如何为多个域名设置cookie?

我理解安全性问题,并且确定已经完成过此操作。原因是单点登录(SSO)。

例如:

account.domain.com 需要为以下域名设置登录状态:

domain.com, domain1.com, domain2.com。

是否有使用PHP和cookies或任何替代方法的简单方式?


这是StackOverflow上的另一篇帖子,展示了Facebook如何实现跨域Cookie设置,而且使用iframe和JavaScript确实是可行的。https://dev59.com/vG445IYBdhLWcg3wydBk - inorganik
4个回答

33

domain.com绝对无法为domain1.com设置cookie。你正在尝试的只能通过让用户的浏览器向每个域提交请求,然后设置自己的cookie来解决。

然后,您需要一种方法来验证用户的身份。有两种方法:

  1. 后台通信 - 网站直接联系以确定用户是否已登录。
  2. 在GET或POST中传递令牌 - 当用户的浏览器重定向到另一个站点时,会传递一个包含身份和会话状态的数字签名参数。

这真的很复杂。我建议您不要自己实现。看看SimpleSAMLPHP,了解我所描述的PHP实现。


这里还有另一种方法,让domain.com连接到domain1.com并获取token,然后将该token作为JS调用的标头或单独字段传递,然后domain1.com应该检查该token并相应地做出响应。这样说清楚了吗? - Hafiz
这是错误的... $.ajax( { type: "POST", url: "https://www.crossdomain.com/tracker.php", dataType: 'jsonp', xhrFields: { withCredentials: true }, crossDomain: true } ); 这将把所有的 cookie 传递给不同的域。 - undefined

6
你所尝试的无法完成。(这是一个浏览器安全问题,而不是PHP问题。)除非使用某种形式的站外认证,否则你最接近的实现方法是使cookie跨子域名可访问,在这种情况下,你只需使用PHP的set_cookie函数的可选“domain”参数。

6

可以通过一个域像主控一样,其他域像从属一样来实现此操作。

比如,我们有一个域 accounts.domain.com,它是我们的主控。

然后我们有三个从属域,分别是 domain.comsomething.comanother.com

当你登录 domain.com 时,实际上是在网站 accounts.domain.com 上,然后你会获得一个带有浏览器唯一标识符的 cookie,并被重定向到 domain.com 的登录后页面(即 domain.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>)。这个登录后页面将联系 accounts.domain.com,并用浏览器 ID 查询它。如果交易成功,则你将从 domain.com 获得登录 cookie。

接下来,在每个域(domain.comsomething.comanother.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>),从这个点开始,与登录部分相同。我们无缝漫游到另一个域(用户不知道,因为浏览器通常不会显示重定向页面,直到经过了发送服务器的头文件/接收浏览器的部分)。

如果实际上没有活动登录,则站点将将此“负登录”保存到会话中,并且不再尝试检查登录(直到我们尝试登录或加载另一个域)。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接