2017-02-10 64 views
1

OpenID Connect Basic Client Implementer's Guide索赔部分2.1.6.1客户端必须以交换授权代码的令牌发送POST请求身份提供者/token路线的令牌。交换代码,在开放ID连接授权码流

有显示的示例如下:

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

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA 
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb 

我完全理解为什么一个需要提供grant_type参数,同时我也明白你为什么需要提供code

HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-cache, no-store 
Pragma: no-cache 

{ 
    "access_token":"SlAV32hkKG", 
    "token_type":"Bearer", 
    "expires_in":3600, 
    "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", 
    "id_token":"eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso" 
} 

没有我不知道,如果响应:

但我看一看部分2.1.6.2答案是不使用重定向,而是通过发送一个JSON编码的身体一个简单的200响应给出是而不是给出使用重定向,但直接发送到客户端,那么为什么上面的请求包含redirect_uri参数?

这是来自第2.1.2部分的复制/粘贴错误,最初请求授权码,还是我错过了什么?

回答

1

不,我不知道,如果没有给出使用重定向的响应,而是直接发送到客户端,那么为什么上面的请求包含redirect_uri参数?

发送redirect_uri令牌端点实际上是一个安全功能,在OAuth 2.0 Authorization Framework specification很好的解释:

当使用授权码交付式请求授权,客户端可以通过指定一个重定向URI “redirect_uri”参数。如果攻击者可以操纵重定向URI的值,它可以导致授权服务器将资源所有者用户代理重定向到攻击者控制下的具有授权码的URI。

攻击者可以在合法客户端创建一个帐户并启动授权流程。当攻击者的用户代理被发送到授权服务器以授予访问权限时,攻击者抓取合法客户端提供的授权URI,并用攻击者控制下的URI替换客户端的重定向URI。然后攻击者欺骗受害者跟随被操纵的链接授权访问合法客户端。

一旦在授权服务器上,代表合法和受信任的客户端提示正常的有效请求,并授权该请求。受害者随后被攻击者用授权码重定向到一个端点。攻击者通过使用客户端提供的原始重定向URI将授权码发送到客户端来完成授权流程。客户端将授权码与访问令牌交换,并将其链接到攻击者的客户端帐户,该客户端帐户现在可以访问由受害者授权的受保护资源(通过客户端)。

为了防止这种攻击,授权服务器必须确保用于获取授权码的重定向URI与为授权码交换访问令牌时提供的重定向URI相同。授权服务器必须要求公共客户端,并且应该要求机密客户端注册他们的重定向URI。如果请求中提供了重定向URI,则授权服务器必须根据注册值对其进行验证。

它在OAuth 2.0 Threat Model and Security Considerations RFC也提到:

授权服务器应该能够每个授权的“代码”绑定到实际的重定向URI用作客户端的最终用户重定向目标授权过程。当客户端试图为访问令牌交换相应的授权“代码”时,应该验证该绑定。这种措施是针对通过伪造网站的授权“代码”泄漏的对策,因为攻击者不能使用另一个重定向URI将授权“代码”交换为令牌。

+0

我*几乎*得到它;-)。只剩下一件事:为什么“攻击者无法使用另一个重定向URI将授权”代码“交换为令牌。”当然,它显然必须匹配,所以它不能是另一个,但是如果攻击者能够获得代码,他们是不是也能够获得重定向uri呢? AFAICS重定向uri并未用于实际重定向,仅用于比较,是吗? –

+1

是的。它仅用于比较'redirect_uri'和最初由客户端应用程序发送的'redirect_uri'。实际上,它只在非常特定的情况下才有用,因为'client_id'比较已经可以防止混淆的副攻击(其中客户端应用程序将被授予发给另一客户端的授权代码)。典型的用例包括共享相同'client_id'但具有不同'redirect_uri'的应用程序,它指向应用程序的不同部分。比较'redirect_uri'确保代码由您的应用的正确组件交换。 – Pinpoint

+1

另一个(理论)用例是授权服务器允许客户端应用程序注册而不必列出他们将使用的'redirect_uri'。在这种情况下,这种对策非常重要,因为授权服务器无法检测到攻击者在授权请求期间试图强制受害者重定向到虚假的'redirect_uri'(因为服务器无法将其与已知的URL列表)。实际上,这种攻击非常罕见,因为大多数授权服务器在创建客户端应用程序时都需要注册'redirect_uri'。 – Pinpoint