如何发现不透明访问令牌的颁发者?

How can I discover the issuer of an opaque access token?

我正在使用 OpenID Connect 来控制对我的 REST API 的访问。为请求提供服务时,我需要做的一件事是根据请求的 Authorization: Bearer ... header.

中的访问令牌获取 OIDC UserInfo

到目前为止,我一直在使用 JWT,而且效果很好。我正在考虑将其扩展为也适用于不透明标记。

我的策略是基于我对 OpenID Connect Discovery spec, section 4:

的理解
  1. 从访问令牌中提取 iss
  2. 通过获取 ${iss}/.well-known/openid-configuration 并查询 userinfo_endpoint 的 JSON 来发现用户信息端点。
  3. HTTP GET userinfo_endpoint,将访问令牌作为 Authorization: Bearer ... header.
  4. 传递

这适用于不透明的令牌...除了第 1 步。目前,我必须通过 out-of-band 机制知道发行人是谁,因为我不知道如何从不透明令牌(老实说,考虑到它是 不透明,这是有道理的)。我看到了几种可能性:

感谢大家的帮助。

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

旁边

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

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

外国访问令牌

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

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

最好使用授权服务器的 'federated login capabilities',这样可以得到更清晰的结果和更少的问题:

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

回答我自己的问题:

你不能从一个不透明的令牌单独中发现任何东西

不透明令牌可以是任何东西,甚至只是一个 UUID,用作授权服务器中数据库 table 的密钥。 只有可以通过调用内省端点来使用此类令牌获得任何东西。

(即使 不透明令牌中编码的任何内容,它 应该 解码的唯一方法是调用内省端点.)

就此而言,我最初的问题有点被误导了,因为我试图解码一些本质上不表达其编码的东西。这就像在不知道指针指向什么的情况下尝试使用指针一样。事实上,我发现很多地方使用术语“参考令牌”来表示“不透明令牌”。

感谢 一些有用的反馈。