在 OAuth2 中,/introspect 端点是供 OAuth 客户端调用还是供 OAuth 资源服务器调用?

In OAuth2, is the /introspect endpoint meant for the OAuth Client to call, or the OAuth Resource Server to call?

我正在了解 OAuth /introspect 端点作为验证访问令牌的一种方式。我正在使用 Okta,我认为它与问题相关。

I've read online that the /introspect endpoint is intended to be called by an OAuth Resource Server(例如,OAuth 客户端将调用资源服务器,提供访问令牌,资源服务器将调用 /introspect 端点以确保令牌有效)。

但是,/introspect 端点 (at least with Okta) 要求您提供 OAuth 客户端凭据(作为基本身份验证 header,或者在没有客户端的情况下秘密,只是一个 client_id 请求参数)。

那么,资源服务器如何在没有 OAuth 客户端 ID and/or 机密的情况下调用 /introspect 端点?这让我想知道 /introspect 端点是否应该由 OAuth 客户端调用,对我来说,这似乎没有用。

根据我的理解,内省端点应由 API 资源.

调用

此端点由 API 资源使用,以验证由客户端应用程序发出的传入 HTTP 请求提供的持有者令牌

大多数情况下,当提供的承载令牌是 参考令牌 时会发生这种情况,因此 API 资源服务器需要知道所提供的参考令牌是否关联使用有效的访问令牌。必须通过调用内省端点向安全令牌服务器询问此信息。

您可以找到更多信息here in the identity server docs。身份服务器是 openid 连接协议的 .NET 实现,它基于 oauth2。

This is a documentation that shows you how to call the introspection endpoint programmatically. This documentation is specific for a .NET library called identity model,但这与您的问题无关,因为库只是实现了协议。

正如您在链接文档的示例中所见,调用内省端点时需要指定的客户端 ID 只是 API 资源的名称。客户端密码是您为 API 资源定义的 API 资源密码。

所以,你的困惑的根源只是术语过多。在调用内省端点的上下文中,以下两个等式均成立:

  • 客户端id == API资源名称
  • 客户端密码 == API 资源密码

docs 证实了我的两个假设。

如果有帮助,请将我的一些资源添加到 Enrico 的回答中:

  • API Setup - 请参阅第 6 步 - 您必须为 API

    注册一个 OAuth 客户端
  • API OAuth Messages - 请参阅步骤 16、17 和 19,了解您的 API 需要处理的三种响应类型

  • API Code - NodeJS 中的示例实现

请参考this文章。资源服务器需要是在 Okta 上注册的客户端应用程序,并且 /introspect 中的客户端凭据是指此客户端的。