【问题标题】:How can I discover the issuer of an opaque access token?如何发现不透明访问令牌的颁发者?
【发布时间】:2021-08-15 17:26:07
【问题描述】:

我正在使用 OpenID Connect 来控制对我的 REST API 的访问。处理请求时我需要做的一件事是根据请求的 Authorization: Bearer ... 标头中的访问令牌获取 OIDC UserInfo

到目前为止,我一直在使用 JWT,并且效果很好。我正在考虑扩展它以使用不透明的令牌。

我的策略一直基于我对OpenID Connect Discovery spec, section 4的理解:

  1. 从访问令牌中提取iss
  2. 通过获取 ${iss}/.well-known/openid-configuration 并在 JSON 中查询 userinfo_endpoint 来发现 userinfo 端点。
  3. HTTP GET userinfo_endpoint,将访问令牌作为Authorization: Bearer ... 标头传递。

这适用于不透明令牌...除了第 1 步。目前,我必须通过带外机制知道发行者是谁,因为我不知道如何从不透明令牌中获取发行者(老实说,考虑到它是不透明,这是有道理的)。我看到了一些可能性:

  • 也许我只是应该知道是谁发布的,而我的问题被误导了。
  • 也许最好的办法是尝试列出已知发行者的列表,看看其中一个是否有效。
  • 也许有一种机制可以发现不透明令牌的发行者。 (The spec refers to WebFinger,但这似乎不适合我的用例。)
  • 也许有一些我没有考虑过...

感谢大家的帮助。

【问题讨论】:

    标签: oauth-2.0 openid-connect


    【解决方案1】:

    处理不透明令牌的标准机制是通过introspection。此外,首选选项是只有一种类型的访问令牌 - 由您的授权服务器 (AS) 颁发,它位于您的 API 旁边。

    自省结果可以是声明负载或 JWT。插入一个 API 网关是很常见的,例如在this article 中,以便网关进行实际的自省调用。然后网关应缓存使用相同访问令牌进行的后续调用的结果。

    不透明令牌通常是 GUID 或类似的东西,并且颁发者值不存储在令牌中 - 它存储在颁发授权服务器的后端状态中。确定发行者的唯一方法是尝试自省令牌。

    外国访问令牌

    旨在避免在您的 API 中使用外部访问令牌,如下例所示。这会使控制添加到令牌和令牌生命周期的数据变得困难:

    • 用户使用 Google 登录 - 然后 API 使用 Google 访问令牌
    • 用户使用 Microsoft 登录 - 然后 API 使用 Microsoft 访问令牌

    最好使用授权服务器的“联合登录功能”,从而获得以下更清晰的结果和更少的问题:

    • 用户使用 Google 登录 - 然后 API 使用您的 AS 访问令牌
    • 用户使用 Microsoft 登录 - 然后 API 使用您的 AS 访问令牌

    【讨论】:

    • 谢谢!几个后续问题: * 如果您不知道发行者是谁,则无法进行自省。正确的? * “授权服务器”是指 Okta/Auth0/Curity 之类的东西?
    • 如果你不知道发行者是谁,你可以尝试对错误的提供者进行自省——这将是次优的。是的 - 可以使用这些提供商 - 或者您可以使用云服务,例如 AWS Cognito 或 Azure AD。关键是 AS/instance 由你控制,以便你的 API 获得他们需要的令牌数据。
    【解决方案2】:

    回答我自己的问题:

    您无法从不透明的令牌中发现任何东西单独

    不透明的令牌可以是任何东西,甚至只是用作授权服务器中数据库表键的 UUID。 唯一可以使用此类令牌获取任何内容的方法是调用自省端点。

    (即使在不透明令牌中编码了任何内容,应该对其进行解码的唯一方法是调用自省端点。)

    在某种程度上,我最初的问题有些误导,因为我试图解码本质上不能表达其编码的东西。这就像在不知道指针指向什么的情况下尝试使用指针。确实,我发现很多地方使用术语“参考标记”来表示“不透明标记”。

    感谢 Gary Archer 提供一些有用的反馈。

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2020-08-12
      • 2018-12-30
      • 1970-01-01
      • 2021-10-23
      • 2022-11-22
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多