我不明白google如何实现以下单点登录机制:
第二个站点如何检测到我已经登录。 它们是不同的领域。 Youtube无法读取Gmail的Cookie。
我读过的关于单点登录的所有解决方案都不允许这样做。客户端始终要求获得中央登录应用程序的权限。 在我的示例中,YouTube不知道我是登录Gmail的用户(实际上它确实知道,但我不明白如何)
请注意,我手动输入“youtube”的网址。我没有从gmail的上方工具栏中删除youtube图标(在这种情况下,gmail可能会通过网址传递一些auth params)。
答案 0 :(得分:8)
Cookie是在特定域上设置的。例如:
setcookie(name,value,expire,path,domain)
当您在“mail.google.com”之前登录gmail时,您已被重定向到“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重定向。
答案 1 :(得分:4)
可以使用中间域在域之间共享Cookie和localStorage。在主页上嵌入了一个“iframe”,它访问cookie并将消息发送到主。
mail.google.com
和youtube.com
可以使用accounts.google.es
共享Cookie。打开Chrome->Inspect->Resources->Local storag
e,您将在accounts.google.com
中看到JWT格式的身份验证令牌。
我详细介绍了这个答案中的技术步骤:https://stackoverflow.com/a/37565692/6371459。另请查看https://github.com/Aralink/ssojwt以查看在中央域中使用JWT进行单点登录的实现
答案 2 :(得分:1)
检查出来.. http://www.codeproject.com/Articles/106439/Single-Sign-On-SSO-for-cross-domain-ASP-NET-applic。 本文包括SSO跨域的解释和示例。
答案 3 :(得分:0)
据我记忆,如果我没有错,cookie包含一个指定的字段,其中包含可以读取和获取此cookie的域。这样做是为了防止某些网站读取您的所有Cookie列表并开展自己的业务。您应该能够看到哪种网站可以“看到”您的Gmail密码。
如果我错了,请纠正我,这应该编写有关SID和gmail-YouTube示例的答案。
答案 4 :(得分:0)
在评估此跨域SSO主题时,我想出了可能使用 cookie加上时间戳的新的SSO同步流程。尽管它不是Google所使用的流程,但我认为可以为域数量有限的系统实现该流程。
此流程不使用3rd party cookie
这将是一长篇文章:)
举个例子,假设我们在示例宠物论坛中有以下域:
dog.domain2.com
,用户尚未登录。dog.domain2.com
中的“登录”按钮account.domain1.com
进行登录
redirect_uri
,如登录成功后返回的URL一样.domains2.com
域上设置一个cookie(稍后会在cookie值上提供更多信息).domains3.com
域上设置cookie .domains1.com
域上设置cookie 现在,登录流程完成后,我们在所有3个域中都有Cookie 。我们的任何服务(例如https://cat.domain1.com / https://dog.domain2.com / https://rabbit.domain2.com)都可以在自己的域下访问此Cookie。
have_user_login
= true / false有同步问题User A
登录,访问https://cat.domain1.com,User A
注销和User B
登录User A
而不是User B
,因此出现了同步问题。user_id
存储在那些cookie上,然后让所有域都可以看到它们并相应地设置用户。
user_id
复制到其自己的浏览器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
登录与登录非常相似,基本上: