【问题标题】:Is it safe to use "sub" claim in keycloak token for user id in internal DB在 keycloak 令牌中为内部数据库中的用户 ID 使用 \"sub\" 声明是否安全
【发布时间】:2022-12-29 16:08:54
【问题描述】:
我正在开发一个将来可能支持社交登录的应用程序(除了我们自己的 keycloak 用户名/电子邮件注册之外)。
我正在尝试确定使用 keycloak ID 令牌中的“sub”声明作为我们内部 mongo 数据库中用户的主键(“_id”字段)是否安全。理想情况下,我希望使用令牌中的 id,因为在某些情况下,它可以让我无需在我们的 api 中进行额外的用户查找。
我看到 Microsoft azure 文档显示他们的身份验证令牌同时具有“sub”和“oid”,其中建议将“oid”用于内部用户查找,因为它是全球唯一的。 See this section。
此 ID 跨应用程序唯一标识用户 - 登录同一用户的两个不同应用程序将在 oid 声明中收到相同的值。 Microsoft Graph 将返回此 ID 作为给定用户帐户的 id 属性。
那么在 keycloak 中是否有等效的“oid”声明,我是否需要添加自定义声明来实现等效,或者我可以只使用“sub”声明?
【问题讨论】:
标签:
authentication
oauth-2.0
jwt
keycloak
openid-connect
【解决方案1】:
查看JSON Web Token (JWT)文档,即“sub”(主题)声明部分:
4.1.2. “sub”(主题)声明
“sub”(主题)声明标识作为 JWT 主题的主体。 (...)。主题值必须在发行人的上下文中限定为本地唯一或全局唯一.这个索赔的处理是一般具体应用.
(...)。使用此声明是选修的.
仅从我对这段文字的解释来看,不能保证给定用户的 sub 声明在不同的应用程序中是相同的(IE。,客户)。此外,该声明是可选的。
所以为了准确回答你的问题,我们需要看看
OpenID connect的上下文:
OpenID Connect 对 OAuth 2.0 进行的主要扩展,以使最终用户能够进行身份验证是 ID 令牌数据结构。
子:必需的.主题标识符。最终用户在发行人中的本地唯一且永不重新分配的标识符,旨在由客户使用(...)。
好吧,根据这段文字以及要获得 ID Token 必须将 openid 范围传递给请求这一事实,您可以确定 sub 声明将出现在 ID Token 中。
关于 sub 是否对所有客户都相同的问题,这也在同一文档的 Subject Identifier Types 部分下解决:
主题标识符类型
主题标识符是本地唯一的并且永远不会重新分配
最终用户在发行人中的标识符,旨在由客户使用。
本规范定义了两种主题标识符类型:
民众- 这提供了对所有客户具有相同的子(主题)值.如果提供者在其发现文档中没有 subject_types_supported 元素,则这是默认值。
成对的- 这提供了一个不同的子
对每个客户的价值,以免使客户将
最终用户未经许可的活动。
OpenID 提供商的
发现文档应该列出其支持的主题标识符类型
在 subject_types_supported 元素中。如果有不止一种类型
在数组中列出,客户可以选择提供其首选
在注册期间使用 subject_type 参数的标识符类型。
Since a while 现在,keycloak 支持public 和pairwise 主题标识符类型。如果没有明确指定
public 是默认使用的。
所以总结一下:
或者我可以只使用“子”声明吗?
是的,只要您考虑到正在使用的主题标识符类型。