【问题标题】:Why is the username commonly used for user identification with OAuth2?为什么用户名通常用于 OAuth2 的用户识别?
【发布时间】:2019-02-03 08:20:56
【问题描述】:

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

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

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

获取 ID 的正确解决方案是什么?也许是令牌自省或 JWT 令牌的一部分?

【问题讨论】:

  • 你的外部认证服务器是否实现了spring oauth2授权服务器?
  • @SAP 是的,所有服务(当前)都使用 spring

标签: authentication oauth microservices


【解决方案1】:

当您提到“经过身份验证”时,我假设您以 OAuth 2.0 NOT an Authentication protocol 身份谈论 OpenID Connect。

用户 ID 的唯一真实指示是“sub”值,它依赖于 OpenID Connect 服务提供商,并且是 本地唯一,并且从未在 中重新分配标识符Authenticated Entity 的颁发者,旨在由 OAuth 客户端使用。 OpenID Connect 定义了两种主题标识符类型:

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

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

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

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

因此子值仅在 Issuer 值的上下文中是唯一的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多