Som*_*per 3 authentication oauth-2.0 jwt openid-connect keycloak
我正在开发一个将来可能支持社交登录的应用程序(除了我们自己的 keycloak 用户名/电子邮件注册之外)。
我正在尝试确定使用 keycloak ID 令牌中的“sub”声明作为我们内部 mongo 数据库中用户的主键(“_id”字段)是否安全。理想情况下,我希望使用令牌中的 id,因为在某些情况下,我可能不需要在 api 中进行额外的用户查找。
我看到 Microsoft azure 文档显示他们的身份验证令牌同时具有“sub”和“oid”,其中“oid”建议用于内部用户查找,因为它是全局唯一的。请参阅本节。
此 ID 唯一标识跨应用程序的用户 - 登录同一用户的两个不同应用程序将在 oid 声明中收到相同的值。Microsoft Graph 将返回此 ID 作为给定用户帐户的 id 属性。
那么,keycloak 中是否存在与“oid”声明等效的内容,我是否需要添加自定义声明来实现等效项,或者我可以只使用“sub”声明来代替?
查看JSON Web Token (JWT)文档,即“sub”(主题)声明部分:
4.1.2. “sub”(主题)声明
“sub”(主题)声明标识了作为 JWT 主题的主体。(...)。主题值必须要么在发行人的上下文中局部唯一,要么全局唯一。该声明的处理通常是特定于应用程序的。(...)。此声明的使用是可选的。
仅根据我对本文的解释,不能保证给定用户的声明在不同应用程序(即sub客户端)中是相同的。此外,该声明是可选的。
因此,为了准确回答您的问题,我们需要查看OpenID connect的上下文:
OpenID Connect 对 OAuth 2.0 进行的主要扩展是 ID 令牌数据结构,以使最终用户能够进行身份验证。
子: 必需。主题标识符。最终用户的发行者内本地唯一且永不重新分配的标识符,旨在由客户端使用(...)。
好吧,根据本文以及要获得您ID Token必须将范围传递给请求的事实openid,您可以确定声明sub将在ID Token.
sub关于是否对所有客户端都相同的问题,这也在同一文档的主题标识符类型部分下得到解决:
主题标识符类型
主体标识符是最终用户在发行者中本地唯一且永不重新分配的标识符,旨在由客户端使用。
本规范定义了两种主题标识符类型:
public - 这为所有 Clients 提供相同的子(主题)值。如果提供者在其发现文档中没有 subject_types_supported 元素,则这是默认值。
成对- 这为每个客户端提供不同的子值,以免客户端在未经许可的情况下关联最终用户的活动。
OpenID 提供者的发现文档应该在 subject_types_supported 元素中列出其支持的主题标识符类型。如果数组中列出了不止一种类型,客户端可以选择在注册期间使用 subject_type 参数提供其首选标识符类型。
一段时间以来,keycloak 支持public和pairwise主题标识符类型。如果没有明确指定,则public默认使用该值。
所以得出结论:
或者我可以只使用“sub”声明来代替吗?
是的,只要您考虑到正在使用的主题标识符类型。
| 归档时间: |
|
| 查看次数: |
3154 次 |
| 最近记录: |