oauth-2.0 - 使用第三方站点进行 OAuth2 / OIDC 授权代码流程 - 了解最终步骤
问题描述
我有一个网站,希望使用第三方服务登录(通过使用 OAuth2 和 OIDC)。我了解所涉及的 90% 的过程,但没有得到我认为的最后一步。我将描述我在这里看到的步骤,也许有人可以帮助我填补空白。在我的设置中,资源服务器和授权服务器是同一台机器。
这是我设想的登录过程。
- 用户来到我的站点(我们称之为站点 A)并点击登录
- 他们被重定向到他们输入用户名/密码的身份验证站点(站点 B)。
- 假设凭据正确,它们随后会使用身份验证代码重定向回站点 A。
- 站点 A 采用此身份验证代码,并在反向通道中再次与站点 B 通信,要求交换代码以获取令牌。
- 站点 B 向站点 A 提供访问令牌(不是向最终用户,向服务器)
- 然后站点 A 再次与站点 B 通信(在这种情况下,资源和身份验证服务器是相同的)并获取相关的用户详细信息。
所以用户通过了身份验证,我们知道他们有什么声明,但是,在上述场景中我没有得到的是站点 A 如何知道我(最终用户)是谁。
我从未登录过站点 A,所以大概没有设置 cookie。基本上我已经访问了该站点,被重定向到另一个站点,在那里登录,然后被重定向回站点 A,但是在最后一次重定向时是否设置了 cookie 来识别我?
我已经在网上阅读了很多关于此的内容,但没有找到明确的答案。
另外,我认为在授权代码流中访问令牌永远不会到达用户而是驻留在应用程序服务器上的想法是否正确?
解决方案
OpenID Connect 身份验证服务器提供userinfo 端点,站点 A 可以使用该端点获取有关授权访问令牌(或授权代码)的用户的信息。为了使身份验证提供者(站点 B)能够做到这一点,它需要保持令牌与其用户之间的关联。所以没有为此目的的cookie。
您对身份验证代码流是正确的-访问令牌保留在后端-无需将其发送给前端/用户。
为了能够将 SiteA 后端保存的令牌与来自浏览器的后续请求配对,您有几个选择:
- 您可以使用带有 cookie 的后端会话,这非常简单,因为大多数后端框架都内置了对它的支持。cookie 会随每个请求自动发送,并且令牌可以存储在会话对象中。如果您需要集群,此解决方案可能更难扩展。
- 您可以创建自己的会话实现 - 通过使用 cookie 或通过 REST API 上预期的某个标识符作为 Authorization HTTP 标头值。后端会话数据可以保存在一些分布式存储中,例如 Hazelcast 或数据库。会话标识符可以采用签名 JWT 的形式,因此您可以在其中保留用户信息。
推荐阅读
- php - PHP - 通过 $_POST 从 foreach 循环提交日期/时间/选择输入值不返回任何内容
- javascript - Array.reduce 中对象解构的使用
- jquery - 如何多次触发关键帧动画(在每个模糊事件上)?
- c# - 使用列表
动态写入文件:格式问题 - android - Android:如何处理 XML 中的多个根标签?
- visual-studio-2015 - 如何在 Visual Studio 扩展中处理特定文件类型的加载
- php - 检查手机号码CF7
- angular - 找不到模块:错误:无法解析'commonjs-proxy:
- python - 如何使用 python 替换字符串中的 '\N',因为它会导致 unicodeescape 错误?
- python - Python - 从列表下的列表中获取项目