我想使用oauth2设置资源服务器和外部身份验证服务器,这两个服务器都有自己的数据库,以避免耦合。
除了验证用户已通过身份验证之外,我还需要知道哪个用户已通过身份验证。如果资源和身份验证服务器共享同一个数据库,这将非常简单。但是既然不是这种情况,我一直想知道如何做到这一点。对我来说,显而易见的选择是以某种方式获取用户ID。但是,例如,Spring仅在调用/ oauth / check_token时返回用户名,在所有JWT示例中,我都已经看到用户名包含在有效负载中,而不是ID。
但是,当用户名有很多缺点(它们可能会更改,它们可能不是唯一的,...)时,为什么每个人似乎都比ID更喜欢用户名?
获取ID的正确解决方案是什么?也许是令牌内省还是JWT令牌的一部分?
答案 0 :(得分:1)
正如您提到的“已认证”一样,我假设您以OAuth 2.0 NOT an Authentication protocol的身份谈论OpenID Connect。
用户ID的唯一真实指示是“ sub”值,该值取决于OpenID Connect服务提供商,并且是本地唯一并且从未在中重新分配标识符身份验证实体的颁发者,旨在由OAuth客户端使用。 OpenID Connect定义了两种主题标识符类型:
OpenID Connect提供程序的OpenID Connect发现文档 SHOULD 在subject_types_supported元素中列出了其受支持的主题标识符类型。 如果数组中列出了不止一种类型,则OAuth客户端可以选择在注册过程中使用subject_type参数提供其首选标识符类型。
Sub的长度不得超过255个ASCII字符。
子值是区分大小写的字符串。
因此,子值仅在Issuer值的上下文内才是UNIQUE。