33

我不明白google如何实现以下单点登录机制:

  1. 例如,我登录 gmail(我想这会在我的授权下创建一个 cookie)
  2. 我打开一个新标签并直接输入“youtube”的网址
  3. 然后我进入youtube登录。

第二个站点如何检测到我已经登录。它们是不同的域。Youtube 无法读取 Gmail 的 cookie。

我读过的所有关于单点登录的解决方案都不允许这样做。客户端总是请求中央登录应用程序的权限。在我的示例中,YouTube 不知道我是登录 Gmail 的同一用户(实际上它确实知道,但我不明白如何)

请注意,我手动输入了“youtube”的网址。我没有点击 gmail 上方工具栏中的 youtube 图标(例如,在这种情况下,gmail 可能会通过 url 传递一些身份验证参数)。

4

5 回答 5

17

cookie 设置在特定域上。前任:

setcookie(name,value,expire,path,domain) 

当您登录 gmail 时,在“mail.google.com”之前,您已被重定向到“accounts.google.com”,然后是“mail.google.com”,因此 cookie 也在“accounts.google.com”上.

在这种情况下,域是“accounts.google.com”,路径是“/”(主路径)。

当您请求“www.youtube.com”然后单击“连接”时,它会快速请求“accounts.google.com”,因此您看不到此重定向并检查您是否在“accounts.google.com”上有 cookie。如果是这样,它会检查 cookie 是否有效且未过期,或者用户是否未被禁止...然后将您重定向到“www.youtube.com/signin?loginthisSession=Sessionid”。此请求包含从“accounts.google.com”的 cookie 中捕获的 sessionid cookie 的值。

在最后一步,“www.youtube.com”会记录您并在“www.youtube.com”域上设置自己的 cookie 并保存它们。

所以诀窍在于 302 HTTP 重定向。

更新

我不知道为什么人们一直提到iframe看看这个问题在2016谷歌上发布的日期没有使用,iframe因为我提到了网络流量的捕获,你可以看到SetSID这意味着设置 SESSION_ID 的 cookie,accounts.google.dz(com)然后重定向到youtube.com它可以不使用 troughtiframe differant domains security measure您不能从域重定向到域 trought iframeneither请在发布前阅读此内容

在此处输入图像描述

于 2013-11-12T12:33:38.127 回答
5

Cookie 和 localStorage 可以使用中间域在域之间共享。在主页上嵌入了一个“iframe”,它访问 cookie 并向主页面发送消息。

mail.google.com并且youtube.com可以使用 共享 cookie accounts.google.es。打开Chrome->Inspect->Resources->Local storage,你会看到accounts.google.comJWT格式的认证token。

我在这个答案中详细介绍了技术步骤:https ://stackoverflow.com/a/37565692/6371459 。另请查看https://github.com/Aralink/ssojwt以查看在中央域中使用 JWT 的单点登录实现

于 2016-05-24T05:53:33.050 回答
2

看看这个.. http://www.codeproject.com/Articles/106439/Single-Sign-On-SSO-for-cross-domain-ASP-NET-applic。文章由SSO跨域的解释和示例组成。

于 2014-01-17T02:51:45.220 回答
0

据我记得,如果我没记错的话,cookies 包含一个指定的字段,该字段包含可以读取和获取此类 cookie 的域。这样做是为了防止某些网站读取您的所有 cookie 列表并自行开展业务。您应该能够看到哪些网站可以“看到”您的 gmail cookie。

如果我错了,请纠正我,这应该编译有关 SID 和 gmail-YouTube 示例的答案。

于 2013-08-09T13:44:48.990 回答
0

在评估这个跨域 SSO 主题时,我想出了一个可能的新 SSO 同步流程,它使用带有时间戳的 cookie。虽然它不是谷歌使用的流程,但我认为这个流程可以用于域数量有限的系统。

此流程不使用3rd party cookie

这将是一个很长的帖子:)

举个例子,假设我们的示例宠物论坛有这些域:

更改为https://account.domain1.com

登录步骤:

  1. 用户去dog.domain2.com,用户还没有登录。
  2. 用户点击登录按钮dog.domain2.com
  3. 用户被重定向到account.domain1.com登录
  4. 用户输入用户名和密码,登录成功
  5. 新步骤,在重定向回 https://dog.domain2.com之前,在所有域上设置 cookie
    1. 将浏览器重定向到https://accounts.domain2.com? ...
    2. .domains2.com域上设置 cookie(稍后将详细介绍 cookie 值)
    3. 将浏览器重定向到https://accounts.domain2.com? ...
    4. .domains3.com在域上设置 cookie
    5. 将浏览器重定向到https://accounts.domain1.com? ...
    6. .domains1.com在域上设置 cookie
    7. 重定向回原始流程
  6. 将用户重定向回原来的服务,即https://dog.domain2.com

现在,在登录流程之后,我们在所有 3 个域上都有 cookie。我们的任何服务(例如https://cat.domain1.com / https://dog.domain2.com / https://rabbit.domain2.com)都可以在自己的域下访问此 cookie。

饼干内容

  • cookie 的内容,应该允许任何网页查看它,并确定是否需要 SSO 同步
  • 可以存储不同类型的 cookie 内容,包括
    • 布尔值表示用户是否登录
    • 用户身份
    • 过期时间

布尔值表示用户是否登录

用户身份

  • 虽然很容易将 cookie 存储user_id在这些 cookie 上,并让所有域都看到它们并相应地设置用户。
    • 这太危险了,因为 cookie 是在父域中设置的,
    • 如果您域下的任何网站被黑客入侵,则可能会发生假冒(复制任何网站user_id,将其粘贴到他们自己的浏览器 cookie 中)。

时间戳过期

  • 我的建议是将 cookie 值设置为SSO expired time,并将类型设置为session cookie,这有以下好处:
    • 如果泄漏/更改,过期时间对安全影响最小
    • 我们的网站可以查看过期时间以了解用户是否需要重新登录
    • 至于为什么会话cookie,是为了当用户关闭浏览器并尝试再次登录时,cookie将被删除,因此也会注销用户
  • 任何使用 SSO 的网页,也应该自己存储一个具有相同过期时间的 cookie
    • 会有这样的情况,User A登录,访问https://cat.domains1.com然后User B登录
    • 由于User A并且User B会有不同的登录过期时间,存储和比较该时间戳将告诉用户再次与 SSO 同步

您的服务的示例检查工具

例如,在https://cat.domains1.com上,您可以将其添加到页面加载的顶部

<?php
$sso_expired_time = $_COOKIE["sso_expired_time "] ?? 0;
$website_expired_time = $_COOKIE["website_expired_time "] ?? 0;

if( (int) $sso_expired_time  < time() || $sso_expired_time  !== $website_expired_time ) {
    // User not sync, perform sync
    setcookie("website_expired_time", $website_expired_time,0,"/", $_SERVER['SERVER_NAME'], true, true);
    // Redirect to https://account.domain1.com for Login
    // Or, Initiate the login sequence for your selected login protocol
    header("Location: https://account.domain1.com/.....") 
    exit;
}
// User is sync

// Page load success, continue other operation

登出

登录与登录非常相似,基本上:

  • 在注销完成之前,重定向到所有 3 个域,就像登录一样
  • 删除 SSO cookie
  • 继续正常的注销流程

方法的优缺点:

  • 专业版:所有域同步都是可能的
  • 优点:无需依赖 3rd 方 cookie
  • 缺点:第一次登录时间更长(大约长 50 毫秒)
  • 缺点:需要在每个网站上进行自定义才能使同步生效
于 2020-09-04T08:09:40.607 回答