的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部分的复制/粘贴错误,最初请求授权码,还是我错过了什么?
我*几乎*得到它;-)。只剩下一件事:为什么“攻击者无法使用另一个重定向URI将授权”代码“交换为令牌。”当然,它显然必须匹配,所以它不能是另一个,但是如果攻击者能够获得代码,他们是不是也能够获得重定向uri呢? AFAICS重定向uri并未用于实际重定向,仅用于比较,是吗? –
是的。它仅用于比较'redirect_uri'和最初由客户端应用程序发送的'redirect_uri'。实际上,它只在非常特定的情况下才有用,因为'client_id'比较已经可以防止混淆的副攻击(其中客户端应用程序将被授予发给另一客户端的授权代码)。典型的用例包括共享相同'client_id'但具有不同'redirect_uri'的应用程序,它指向应用程序的不同部分。比较'redirect_uri'确保代码由您的应用的正确组件交换。 – Pinpoint
另一个(理论)用例是授权服务器允许客户端应用程序注册而不必列出他们将使用的'redirect_uri'。在这种情况下,这种对策非常重要,因为授权服务器无法检测到攻击者在授权请求期间试图强制受害者重定向到虚假的'redirect_uri'(因为服务器无法将其与已知的URL列表)。实际上,这种攻击非常罕见,因为大多数授权服务器在创建客户端应用程序时都需要注册'redirect_uri'。 – Pinpoint