如何发现不透明访问令牌的颁发者?
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:
的理解
- 从访问令牌中提取
iss
。
- 通过获取
${iss}/.well-known/openid-configuration
并查询 userinfo_endpoint
的 JSON 来发现用户信息端点。
- HTTP GET
userinfo_endpoint
,将访问令牌作为 Authorization: Bearer ...
header. 传递
这适用于不透明的令牌...除了第 1 步。目前,我必须通过 out-of-band 机制知道发行人是谁,因为我不知道如何从不透明令牌(老实说,考虑到它是 不透明,这是有道理的)。我看到了几种可能性:
- 也许我只是应该知道是谁发布的,而我的问题被误导了。
- 也许最好的办法是尝试一系列已知的发行人,看看其中一个是否有效。
- 也许有一种机制可以发现不透明令牌的发行者。 (The spec refers to WebFinger,但这似乎不适合我的用例。)
- 也许有些事情我没有考虑...
感谢大家的帮助。
处理不透明令牌的标准机制是通过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 的密钥。 只有可以通过调用内省端点来使用此类令牌获得任何东西。
(即使 是 不透明令牌中编码的任何内容,它 应该 解码的唯一方法是调用内省端点.)
就此而言,我最初的问题有点被误导了,因为我试图解码一些本质上不表达其编码的东西。这就像在不知道指针指向什么的情况下尝试使用指针一样。事实上,我发现很多地方使用术语“参考令牌”来表示“不透明令牌”。
感谢 一些有用的反馈。
我正在使用 OpenID Connect 来控制对我的 REST API 的访问。为请求提供服务时,我需要做的一件事是根据请求的 Authorization: Bearer ...
header.
到目前为止,我一直在使用 JWT,而且效果很好。我正在考虑将其扩展为也适用于不透明标记。
我的策略是基于我对 OpenID Connect Discovery spec, section 4:
的理解- 从访问令牌中提取
iss
。 - 通过获取
${iss}/.well-known/openid-configuration
并查询userinfo_endpoint
的 JSON 来发现用户信息端点。 - HTTP GET
userinfo_endpoint
,将访问令牌作为Authorization: Bearer ...
header. 传递
这适用于不透明的令牌...除了第 1 步。目前,我必须通过 out-of-band 机制知道发行人是谁,因为我不知道如何从不透明令牌(老实说,考虑到它是 不透明,这是有道理的)。我看到了几种可能性:
- 也许我只是应该知道是谁发布的,而我的问题被误导了。
- 也许最好的办法是尝试一系列已知的发行人,看看其中一个是否有效。
- 也许有一种机制可以发现不透明令牌的发行者。 (The spec refers to WebFinger,但这似乎不适合我的用例。)
- 也许有些事情我没有考虑...
感谢大家的帮助。
处理不透明令牌的标准机制是通过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 的密钥。 只有可以通过调用内省端点来使用此类令牌获得任何东西。
(即使 是 不透明令牌中编码的任何内容,它 应该 解码的唯一方法是调用内省端点.)
就此而言,我最初的问题有点被误导了,因为我试图解码一些本质上不表达其编码的东西。这就像在不知道指针指向什么的情况下尝试使用指针一样。事实上,我发现很多地方使用术语“参考令牌”来表示“不透明令牌”。
感谢