首页 > 解决方案 > 使用第三方站点进行 OAuth2 / OIDC 授权代码流程 - 了解最终步骤

问题描述

我有一个网站,希望使用第三方服务登录(通过使用 OAuth2 和 OIDC)。我了解所涉及的 90% 的过程,但没有得到我认为的最后一步。我将描述我在这里看到的步骤,也许有人可以帮助我填补空白。在我的设置中,资源服务器和授权服务器是同一台机器。

这是我设想的登录过程。

  1. 用户来到我的站点(我们称之为站点 A)并点击登录
  2. 他们被重定向到他们输入用户名/密码的身份验证站点(站点 B)。
  3. 假设凭据正确,它们随后会使用身份验证代码重定向回站点 A。
  4. 站点 A 采用此身份验证代码,并在反向通道中再次与站点 B 通信,要求交换代码以获取令牌。
  5. 站点 B 向站点 A 提供访问令牌(不是向最终用户,向服务器)
  6. 然后站点 A 再次与站点 B 通信(在这种情况下,资源和身份验证服务器是相同的)并获取相关的用户详细信息。

所以用户通过了身份验证,我们知道他们有什么声明,但是,在上述场景中我没有得到的是站点 A 如何知道我(最终用户)是谁。

我从未登录过站点 A,所以大概没有设置 cookie。基本上我已经访问了该站点,被重定向到另一个站点,在那里登录,然后被重定向回站点 A,但是在最后一次重定向时是否设置了 cookie 来识别我?

我已经在网上阅读了很多关于此的内容,但没有找到明确的答案。

另外,我认为在授权代码流中访问令​​牌永远不会到达用户而是驻留在应用程序服务器上的想法是否正确?

标签: oauth-2.0openid-connect

解决方案


OpenID Connect 身份验证服务器提供userinfo 端点,站点 A 可以使用该端点获取有关授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供者(站点 B)能够做到这一点,它需要保持令牌与其用户之间的关联。所以没有为此目的的cookie。

您对身份验证代码流是正确的-访问令牌保留在后端-无需将其发送给前端/用户。

为了能够将 SiteA 后端保存的令牌与来自浏览器的后续请求配对,您有几个选择:

  • 您可以使用带有 cookie 的后端会话,这非常简单,因为大多数后端框架都内置了对它的支持。cookie 会随每个请求自动发送,并且令牌可以存储在会话对象中。如果您需要集群,此解决方案可能更难扩展。
  • 您可以创建自己的会话实现 - 通过使用 cookie 或通过 REST API 上预期的某个标识符作为 Authorization HTTP 标头值。后端会话数据可以保存在一些分布式存储中,例如 Hazelcast 或数据库。会话标识符可以采用签名 JWT 的形式,因此您可以在其中保留用户信息。

推荐阅读