Cookies 自动cookie单点登录多个域-如google

Cookies 自动cookie单点登录多个域-如google,cookies,dns,single-sign-on,Cookies,Dns,Single Sign On,我不明白谷歌是如何实现以下单点登录机制的: 例如,我登录了gmail(我想这会在我的授权下创建一个cookie) 我打开一个新标签,直接键入“youtube”的url 然后我进入youtube登录 第二个站点如何检测到我已经登录。 它们是不同的领域。Youtube无法读取Gmail的cookie 我读过的关于单点登录的所有解决方案都不允许这样做。客户端始终请求对中心登录应用程序的权限。 在我的例子中,YouTube不知道我是登录Gmail的同一个用户(实际上它知道,但我不明白怎么做) 请注意,我

我不明白谷歌是如何实现以下单点登录机制的:

  • 例如,我登录了gmail(我想这会在我的授权下创建一个cookie)
  • 我打开一个新标签,直接键入“youtube”的url
  • 然后我进入youtube登录
  • 第二个站点如何检测到我已经登录。 它们是不同的领域。Youtube无法读取Gmail的cookie

    我读过的关于单点登录的所有解决方案都不允许这样做。客户端始终请求对中心登录应用程序的权限。 在我的例子中,YouTube不知道我是登录Gmail的同一个用户(实际上它知道,但我不明白怎么做)


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

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


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

    cookies设置在特定域上。例:

    setcookie(name,value,expire,path,domain) 
    
    当你登录gmail时,在“mail.google.com”之前,你已经被重定向到“accounts.google.com”,然后再重定向到“mail.google.com”,所以cookies也在“accounts.google.com”上

    在本例中,域是“accounts.google.com”,路径是“/”(主路径)

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

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

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

    看看这个。
    本文包括SSO跨域的说明和示例

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

    mail.google.com
    youtube.com
    可以使用
    accounts.google.es
    共享cookies。打开
    Chrome->Inspect->Resources->Local storag
    e,您将在
    accounts.google.com
    中看到JWT格式的身份验证令牌


    我已经在这个回答中详细介绍了技术步骤:。还看一看在中心域中使用JWT实现单点登录

    在评估这个跨域SSO主题时,我提出了一个可能的新SSO同步流,使用带有时间戳的cookie。尽管它不是Goog使用的流le,我认为这个流程可以在域数量有限的系统中实现

    此流不使用
    第三方cookie

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

    领域 举个例子,假设我们的示例宠物论坛有以下域名:

    • (用于SSO登录)
    • .domain1.com(例如)
    • .domain2.com(例如)
    • .domain3.com(例如)
    改为:
    • 添加和,将两个主机名通信路由到托管服务器
    登录步骤:
  • 用户进入
    dog.domain2.com
    ,用户尚未登录
  • 用户在
    dog.domain2.com
  • 用户获得重定向至
    account.domain1.com
    登录
    • 此步骤可以是任何登录协议、OAuth、OIDC、SAML、CAS等
    • 所以,重要的是用户登录后被重定向回原来的页面
    • 这么说吧
    • 重定向\u uri
      如URL中所示,以便在登录成功后返回
  • 用户输入用户名和密码,登录成功
  • 新步骤,在重定向回之前,在所有域上设置cookie
  • 将浏览器重定向到
  • .domains2.com
    域上设置cookie(稍后将详细介绍cookie值)
  • 将浏览器重定向到
  • .domains3.com
    域上设置cookie
  • 将浏览器重定向到
  • .domains1.com
    域上设置cookie
  • 重定向回原始流
  • 将用户重定向回其原始服务,即
  • 现在,在登录流之后,我们在所有3个域上都有cookie。我们的任何服务(例如//)都可以在自己的域下访问此cookie

    饼干内容
    • cookie的内容应允许任何网页查看,并确定是否需要SSO同步
    • 可以存储不同类型的cookie内容,包括
      • 布尔值表示用户是否登录
      • 用户ID
      • 过期时间戳
    布尔值表示用户是否登录
    • 存储
      有用户登录名
      =true/false有同步问题
    • 假设
      用户A
      登录、访问、
      用户A
      注销和
      用户B
      登录
    • 现在,从这个角度来看,不需要同步
    • 但是,存储的是
      用户A
      ,而不是
      用户B
      ,因此存在同步问题
    用户ID
    • 尽管将
      user\u id
      存储在这些cookie上,让所有域都能看到它们,并相应地设置用户,这很有诱惑力。
      • 这太危险了,因为cookie是在父域设置的
      • 如果任何一个网站在y下