为什么用户名通常用于OAuth2的用户识别?



我想使用 oauth2 设置一个资源服务器和一个外部身份验证服务器,这两个服务器都有自己的数据库以避免耦合。

除了验证用户是否经过身份验证外,我还需要知道哪个用户经过身份验证。如果资源和身份验证服务器共享同一个数据库,则这相当简单。但由于这里的情况并非如此,我一直想知道我该怎么做。对我来说,显而易见的选择是以某种方式获取用户 ID。但是,例如,Spring 仅在调用/oauth/check_token 时返回用户名,在我看到的所有 JWT 示例中,用户名都包含在有效负载中,而不是 ID 中。

但是,为什么每个人似乎都更喜欢用户名而不是ID,而用户名有很多缺点(它们可能会改变,它们可能不是唯一的,...(?

获取 ID 的正确解决方案是什么?也许是代币内省或 JWT 代币的一部分?

正如你提到的"身份验证",我假设你说的是OpenID Connect作为OAuth 2.0而不是身份验证协议。

用户 ID 的唯一真实指示是"子"值,该值依赖于 OpenID Connect 服务提供商,并且是颁发中经过身份验证的实体的本地唯一且从未重新分配的标识符,旨在由 OAuth 客户端使用。OpenID Connect 定义了两种主题标识符类型:

  • public - 为所有 OAuth 客户端提供相同的子(主题(值。如果提供程序的发现文档中没有 subject_types_supported 元素,则它是默认值。
  • pairwise - 为每个 OAuth 客户端
  • 提供不同的 Sub 值,以免 OAuth 客户端在未经许可的情况下关联最终用户的活动。

OpenID Connect 提供程序的 OpenID Connect Discovery 文档应在subject_types_supported 元素中列出其支持的主题标识符类型。 如果数组中列出了多个类型,OAuth 客户端可以选择在注册期间使用 subject_type 参数提供其首选标识符类型。

子字符的长度不得超过 255 个 ASCII 字符。

子值是区分大小写的字符串。

因此,子值仅在颁发者值的上下文中是唯一的。

最新更新