我使用 OpenID Connect 来控制对我的 REST API 的访问。在为请求提供服务时,我需要做的一件事是根据请求的 Authorization: Bearer ...
标头中的访问令牌获取 OIDC UserInfo。
到目前为止,我一直在使用 JWT,而且效果很好。我正在考虑扩展它以使用不透明令牌。
我的策略基于我对 OpenID Connect Discovery spec, section 4 的理解:
iss
。${iss}/.well-known/openid-configuration
并查询 userinfo_endpoint
的 JSON 来发现 userinfo 端点。userinfo_endpoint
,将访问令牌作为 Authorization: Bearer ...
标头传递。这适用于不透明令牌......除了第 1 步。目前,我必须通过带外机制知道发行者是谁,因为我不知道如何从不透明令牌中获取发行者(老实说,鉴于它不透明,这是有道理的)。我看到了几种可能性:
感谢大家的帮助。
答案 0 :(得分:1)
处理不透明令牌的标准机制是通过 introspection。此外,首选选项是只有一种类型的访问令牌 - 由您的授权服务器 (AS) 颁发,它位于您的 API 旁边。
内省结果可以是声明负载或 JWT。通常插入 API 网关,如 this article 中,以便网关进行实际的内省调用。然后,网关应缓存使用相同访问令牌进行的后续调用的结果。
一个不透明的令牌通常是一个 GUID 或类似的东西,并且发行者值不存储在令牌中 - 它而是存储在发行授权服务器的后端状态中。确定发行人的唯一方法是尝试内省令牌。
外国访问令牌
旨在避免在您的 API 中使用外部访问令牌,如下例所示。这会使控制添加到令牌和令牌生命周期的数据变得困难:
最好使用授权服务器的“联合登录功能”,从而获得以下更清晰的结果和更少的问题:
答案 1 :(得分:0)
回答我自己的问题:
你不能从不透明的令牌单独发现任何东西。
不透明令牌可以是任何东西,甚至只是用作授权服务器中数据库表键的 UUID。 唯一可以使用此类令牌获取任何内容的方法是调用自省端点。
(即使 在不透明令牌中编码了任何内容,应该解码的唯一方法是调用自省端点。)
就此而言,我最初的问题有点被误导了,因为我试图解码一些本质上并不表达其编码的东西。这更像是在不知道它指向什么的情况下尝试使用指针。确实,我发现很多地方使用“引用令牌”一词来表示“不透明令牌”。
感谢 Gary Archer 提供一些有用的反馈。