我有一个使用 Google API 的网络应用程序。身份验证过程会两次调用 google,第一次调用
code
,第二次调用 code
来交换 token
。这两个调用都带有 redirect_uri
参数。第一个调用按照我的预期使用这个参数,重定向回 redirect_uri
,但是,第二个调用,获取令牌,不重定向,验证它似乎忽略这个参数,所以它有什么意义?
访问令牌请求中的
redirect_uri
参数在 OAuth 2.0 规范中被描述为必需参数。
其背后的原因在同一文档的10.6节中有详细描述。简而言之:
request_uri
来获取授权码。唯一能注意到这个伎俩的两方是受害者(合法用户)和服务器。客户仍然不知道这些操纵。redirect_uri
与服务器看到的不匹配,因此请求将被拒绝。没有充分的理由。
如果攻击者已经将客户端误导到对抗性的redirect_uri,他们将在步骤D中知道这个redirect_uri,因此不会阻止他们获取访问令牌
我无法想象攻击者获得授权码但没有获得redirect_uri的场景
我之前在类似问题上说过“没有充分的理由”,但我的答案被删除了,所以我给 RFC 6749 的原作者 Dick Hardt 发了一封电子邮件,询问他这个问题。他的回应如下:
攻击者可能修改了发送到AS的redirect_uri,以便它可以获得响应并修改它。
事实证明,通过将redirect_uri传递到令牌端点似乎不会阻止攻击,我们正在考虑在OAuth 2.1中删除它。