oauth2.0 在内部数据库的用户ID的keycloak标记中使用“sub”声明是否安全

ewm0tg9j  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(158)

我正在开发一个应用程序,将来可能会支持社交登录(除了我们自己的keycloak用户名/电子邮件注册)。
我试图确定使用keycloak ID令牌中的“sub”声明作为我们内部mongo数据库中用户的主键(“_id”字段)是否安全。我最好使用令牌中的id,因为在某些情况下,它可以保存我在API中进行额外用户查找的时间。
我看到微软azure文档显示他们的auth令牌有“sub”和“oid”,其中“oid”被推荐用于用户内部查找,因为它是全局唯一的。
此ID在应用程序中唯一标识用户-使用同一用户登录的两个不同应用程序将在oid声明中收到相同的值。Microsoft Graph将返回此ID作为给定用户帐户的id属性。
那么在keycloak中是否有一个“oid”声明的等价物,我是否需要添加一个自定义声明来实现这个等价物,或者我是否可以只使用“sub”声明来代替?

eoigrqb6

eoigrqb61#

查看JSON Web Token (JWT)文档,即 *“sub”(主题)声明 * 部分:

4.1.2.“次级”(主题)索赔

“sub”(主题)声明标识作为JWT主题的主体。(...)。主题值的作用域必须在发行人上下文中为本地唯一或全局唯一。此声明的处理通常特定于应用程序。(...)。此声明的使用为可选
仅从我对本文的理解来看,不能保证给定用户的sub声明在不同的应用程序(* 即 * 客户机)中相同,而且,该声明是可选的。
因此,为了准确回答您的问题,我们需要看看OpenID连接的背景:
OpenID Connect对OAuth 2.0进行的主要扩展是ID令牌**数据结构,使最终用户能够进行身份验证。

subREQUIRED. Subject Identifier(主体标识符)。在发卡行内为最终用户提供的本地唯一且永不重新分配的标识符,预期由客户端(...)使用。

好的,从这段文字以及为了获得ID Token,您必须将openid作用域传递给请求这一事实来看,您可以确信sub声明将出现在ID Token中。
关于所有客户的sub是否相同的问题,也在同一文档的“受试者标识符类型”章节中进行了说明:

受试者标识符类型

受试者标识符是指在发卡行内为最终用户提供的本地唯一且从未重新分配的标识符,预期由客户使用。

本规范定义了两种受试者标识符类型
public-此选项为所有客户端提供相同的sub(subject)值。如果提供程序在其发现文档中没有subject_types_supported元素,则此选项为默认值。
pairwise-这为每个客户端提供不同的子值,以便不允许客户端在未经许可的情况下关联最终用户的活动。

OpenID提供商的发现文档应该在subject_types_supported元素中列出其支持的主题标识符类型。如果数组中列出了多个类型,客户端可以在注册期间使用subject_type参数选择提供其首选标识符类型。
Since a while现在,keycloak支持publicpairwise主题标识符类型。如果没有显式指定,默认使用public
所以总结一下:
还是我可以用“子”声明代替?
是的,只要您考虑到正在使用的主题标识符类型。

r6l8ljro

r6l8ljro2#

主题值的作用域必须在发行者上下文中本地唯一或全局唯一。
因此,“sub”(主体)声明和“iss”(发行者)声明的组合总是全局唯一的。

相关问题