【问题标题】:OIDC / OAuth - Retrieve SID CookieOIDC / OAuth - 检索 SID Cookie
【发布时间】:2021-11-30 09:56:44
【问题描述】:

我在学习OIDC,有一个理解问题……


上下文:

我想通过 Google(使用 OIDC 协议)在 StackoverFlow 上注册。
所以EndUser还没有注册

  1. EndUser点击用google登录
  2. StackoverFlow 重定向到 https://accounts.google.com/o/oauth2/auth (accounts.google.com)
  3. EndUser 同意并使用凭据登录
  4. Google 通过响应标头 set-cookie: SID=...;Domain=.google.com;Path=/;Expires=...;Priority=HIGH 存储 SID cookie 检查凭据并注册 endUser
  5. Google 重定向到 StackoverFlow
  6. ~~ StackoverFlow 可以访问域 google.com 上的 SID cookie 存储 ~~
  7. Stackoverflow 知道用户已通过身份验证

问题

~~ 为什么 StackoverFlow 在重定向时可以访问域 google.com 上的 SID cookie? ~~

编辑

抱歉,StackoverFlow 没有访问 SID cookie 的权限! 我现在的问题是: stackoverflow 如何知道用户已通过身份验证?因为会话cookie是google设置的...

【问题讨论】:

    标签: cookies oauth-2.0 google-oauth session-cookies openid-connect


    【解决方案1】:

    TL;DR -- Google 为您提供了您提供给 StackOverflow 的代码,StackOverflow 会使用 Google 验证该代码。


    OAuth2.0/OIDC 规范定义了 Google 和 StackOverflow 可以安全地就用户身份验证和授权进行通信的多种方式。 当我学习它时,我必须克服的主要障碍是我期望它会比它更简单。

    Takahiko Kawasaki (@takahiko-kawasaki) 发布了一个方便的参考“所有 OAuth 2.0 流程的图表和电影” https://darutk.medium.com/diagrams-and-movies-of-all-the-oauth-2-0-flows-194f3c3ade85“流程”是用户、身份验证服务器(本例中为 Google)和“客户端”(本例中为 StackOverflow)所采取的一系列步骤。

    StackOverflow 使用的是“验证码”流程,这是本文的第一个流程。

    下面是对所发生情况的稍微简化的描述。

    1) 重定向到 Google

    当您单击 StackOverflow 上的“使用 google 登录/注册”按钮时,它会将您的浏览器重定向到 accounts.google.com,并在查询字符串中包含一些参数:

    • response_type: 这告诉 Google 要使用哪个“流”。在这种情况下,它会给 StackOverflow 一个代码。
    • client_id: 这告诉 Google 身份验证请求是针对 StackOverflow 的。 StackOverflow 之前在他们的 Google 开发者帐户中设置了这一点。
    • 范围:这告诉 Google StackOverflow 想从用户的 Google 帐户访问什么(在这种情况下,只是电子邮件和个人资料信息)
    • state: 这是 Google 将发送回 StackOverflow 的字符串。看起来里面有很多东西,包括如何重新连接 StackOverflow 会话,但我可能弄错了。
    • redirect_uri:这是在完成登录过程后 Google 会将用户发回的网址。

    2) 重定向回 StackOverflow

    当您在 Google 端完成操作后,Google 会将您重定向回 StackOverflow URL,并在查询字符串中添加一些新内容。

    • state: 这与 StackOverflow 发送给 Google 的数据相同。它现在由 Google 发回,因此 StackOverflow 可以在将您发送到 Google 登录时使用它从中断的地方继续。
    • code: 这是一个字符串,表示用户已通过身份验证。 StackOverflow 可以使用此代码一次来验证您是否确实进行了身份验证并从 Google 获得一两个令牌。
    • 范围:这些是 Google 实际允许的范围。它可能与上一步中 StackOverflow 请求的不同。
    • authuser:我不知道这是什么。我认为这不是 OAuth 标准
    • 提示:我不知道这是什么。我认为这不是 OAuth 标准

    3) 使用 Google 进行 StackOverflow 检查

    在这两个重定向之后,StackOverflow 有一个授权码。 StackOverflow 将代码连同 Google 之前分配给 StackOverflow 的秘密字符串一起发送给 Google。

    我在浏览器网络跟踪中看不到这种情况,因为它位于 StackOverflow 和 Google 之间,但我认为 StackOverflow 采用 JWT 格式的身份令牌和授权令牌。

    这些令牌是经过签名的,因此 StackOverflow(或任何人,真的)可以验证它们实际上是由 Google 发送的,并且在传输过程中没有被修改。这些令牌的有效负载包含有关用户的信息,例如姓名、电子邮件地址等。

    注意:Google 授权令牌可能是一个随机的唯一字符串(“不透明令牌”),但我在这里假设它是 JWT。如果它是不透明的,还有一个额外的步骤,StackOverflow 使用它从 Google 获取用户信息。

    【讨论】:

    • * o * 我爱你!非常感谢您抽出宝贵的时间,我对这个主题有了更好的理解!我想这些 JWT 放在每个请求的标头中? :)
    • 看起来 StackOverflow 只是设置了一个 cookie。请务必记住,Google 发送的是 Google 令牌,而不是 StackOverflow 令牌。如果 StackOverflow 在授权标头中使用了不记名令牌,它将使用 Google 令牌,然后为标头创建自己的令牌。
    【解决方案2】:

    我无法在 Chrome 版本 94.0.4606.81 中重现该内容。

    我保留了整个注册过程的网络日志,只看到 Google cookie 流向 Google,Stackoverflow cookie 流向 Stackoverflow。

    screenshot of Google Consent request

    screenshot of Stack Overflow request

    【讨论】:

    • 嗯对不起,没错,我错了!但是 stackoverflow 是如何知道用户经过身份验证的呢?因为会话cookie是google设置的...
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2019-10-15
    • 2018-08-01
    • 2020-02-21
    • 2018-07-04
    相关资源
    最近更新 更多