如何使用 OAuth 2.0 / OpenID Connect 处理后续的 SSO 登录?

How to handle subsequent SSO logins with OAuth 2.0 / OpenID Connect?

我想弄清楚我的服务器如何检查用户之前是否已通过某些第 3 方身份提供商(例如:Facebook)的 SSO 身份验证登录。

查看 JWT documentation,有两个说法对我来说很突出:

如果现有用户随后再次通过 Facebook 登录,我能否保证这两个声明相同?换句话说,我可以将这两个值存储在数据库中,当用户通过 Facebook 再次登录时,我可以查询这些值并确认 s/he 已经存在吗?

为了比较,我知道 SAML 使用对每个用户始终一致的联盟 ID。 OpenID Connect 有类似的东西吗?

将 OAuth 用户 ID 存储在数据库中是一种非常标准的技术,尽管并非所有提供程序都是基于标准的:

  • 子声明的设置方式因供应商而异,但通常总是有一个不可变的声明来唯一标识用户 - 生成的数字或 guid - 在 Facebook 中这被称为 user_id 我相信

识别用户的另一种选择是在验证后将令牌发送到用户信息端点,以获取电子邮件,然后与电子邮件中的应用程序数据匹配。当用户已经存在并且您正在更改他们的登录方式时,这会很有用。

一些提供商可能会为每个应用程序发布不同的用户 ID,尽管这并不常见 - 但值得测试。

在支持多个发行人方面,您有 2 个主要选择:

  • 在运行时从令牌中获取发行者并针对每个发行者进行不同的验证 - 同样,一些供应商可能没有根据标准设置 iss 声明
  • 使用联合登录 - 如 - 这样您的应用程序只会与一个提供商通信并且代码更简单