oauth-2.0 - 如何使用 OAuth 2.0 / OpenID Connect 处理后续 SSO 登录?
问题描述
我试图弄清楚我的服务器如何检查用户以前是否通过 SSO 身份验证与某些 3rd 方身份提供者(例如:Facebook)登录。
查看JWT 文档,有两个声明让我印象深刻:
iss
- “iss”(颁发者)声明标识了颁发 JWT 的委托人sub
- “子”(主题)声明标识作为 JWT 主题的主体。
如果现有用户随后再次通过 Facebook 登录,我能否保证这两个声明相同?换句话说,我可以将这两个值存储在数据库中,当用户再次通过 Facebook 登录时,我可以查询这些值并确认他/她已经存在吗?
作为比较,我知道 SAML 使用对每个用户始终一致的联合 ID。OpenID Connect 有类似的东西吗?
解决方案
将 OAuth 用户 ID 存储在数据库中是一种非常标准的技术,尽管并非所有提供程序都是基于标准的:
- 子声明的设置方式因供应商而异,但通常总是有一个不可变的声明来唯一标识用户 - 生成的数字或 guid - 在 Facebook 中这称为 user_id 我相信
识别用户的另一种选择是在验证令牌后将令牌发送到用户信息端点,以获取电子邮件,然后匹配电子邮件上的应用程序数据。当用户已经存在并且您正在更改他们的登录方式时,这可能很有用。
一些供应商可能会为每个应用程序发布不同的用户 ID,尽管这并不常见 - 但值得测试。
在支持多个发行人方面,您有 2 个主要选择:
- 在运行时从令牌中获取颁发者并针对每个颁发者进行不同的验证——同样,某些供应商可能没有根据标准设置 iss 声明
- 使用联合登录 - 就像在这个问题中一样- 这样您的应用程序只与一个提供者通信并且代码更简单
推荐阅读
- kubernetes - 在 Kubernetes pod 中创建文件
- unity3d - 将两个动画组合在一起
- python-2.7 - 将 .mdb 文件导入 Python
- docker - docker误恢复出厂设置
- javascript - 如果用户从组件的 url 导航到相同的 URL 但查询不同,如何强制路由重新呈现其组件
- javascript - 如何在悬停中显示标题 - css / jquery
- r - |>(管道大于)在R中是什么意思?
- report - 我们如何打印多个报告,例如我想在一个日期范围内为所有员工打印出勤报告?
- css - 用`!important`覆盖父类CSS不起作用?
- oracle - 为什么视图 V$_SEQUENCES 在 Oracle 12.1 中为空,但在 11.2、12.2、18.3、19.3 中工作?