首页 > 解决方案 > 如何使用 OAuth 2.0 / OpenID Connect 处理后续 SSO 登录?

问题描述

我试图弄清楚我的服务器如何检查用户以前是否通过 SSO 身份验证与某些 3rd 方身份提供者(例如:Facebook)登录。

查看JWT 文档,有两个声明让我印象深刻:

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

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

标签: oauth-2.0jwtsingle-sign-onopenid-connect

解决方案


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

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

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

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

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

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

推荐阅读