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

时间:2021-05-27 12:41:59

标签: oauth-2.0 openid-connect

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

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

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

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

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

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

感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

外国访问令牌

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

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

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

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

答案 1 :(得分:0)

回答我自己的问题:

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

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

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

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

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

相关问题