OAuth2 令牌验证和机密客户端

OAuth2 Token Validation and confidential clients

我对 OAuth2 和验证已分配令牌的客户端有疑问。

规范说,对于机密客户端,客户端在请求令牌等时必须进行身份验证,例如使用基本身份验证 header。这意味着我们可以验证客户端是否已注册并且可以授予访问令牌。令牌请求的 headers 可能如下所示:

 POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

规范还说,一旦分配了令牌,客户端就可以使用令牌通过将令牌传递给身份验证来请求信息header,如下所示:

GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: Bearer mF_9.B5f-4.1JqM

这很好,但是假设我们有一个或多个客户端应用程序(我们称它们为 App1 和 App2),以及我们分别通过 Token1 和 Token2 授予它们访问权限的服务器,我们如何确定包含在 auth header 中发送的不记名令牌的请求来自我们分配给它的客户端应用程序。

App2 无法(以某种方式)获取给予 App1 的令牌(恶意或其他方式),并通过将其传递到 auth header 而不是它自己的来使用它来访问资源令牌?

我们是否应该(甚至可能)在我们对资源发出的请求上发送两个身份验证 headers,一个带有我们的不记名令牌,一个带有我们的客户端凭据,以便服务器可以验证令牌是否到达来自正确的客户?

简答:这在今天以标准化的方式是不可能的。

今天的 OAuth 2.0 规范定义了不包含您正在寻找的 属性 的 Bearer 令牌,因为提供它们的客户将获得对资源的访问权限,而无需证明他们是该资源的合法所有者令牌。令牌只能通过机密 (TLS) 渠道传送和使用,因此它们不会以错误的客户端告终。

OAuth 2.0 工作组正在进行定义 OAuth 2.0 的所谓 "Proof of Possession" 扩展的工作,该扩展将允许客户端签署请求,以便接收方可以验证它是否是提交请求的正确客户端.另见:http://www.thread-safe.com/2014/04/oauth-proof-of-possession-drafts.html

OAuth 2.0 规范的当前迭代使用 Bearer 令牌尽可能简单,只是为了让编写客户端实现变得非常容易。如果您同时控制客户端和资源服务器,您可能会想出自己的自定义所有权证明机制,但目前还没有标准的方法。