oauth - 为什么 OAuth 2.0 规范禁止重复使用授权代码?

标签 oauth oauth-2.0

Section 4.1.2在 OAuth 2.0 规范中,有以下语句集:

The authorization code MUST expire shortly after it is issued to mitigate the risk of leaks. A maximum authorization code lifetime of 10 minutes is RECOMMENDED. The client MUST NOT use the authorization code more than once. If an authorization code is used more than once, the authorization server MUST deny the request and SHOULD revoke (when possible) all tokens previously issued based on that authorization code.



我的问题是为什么授权码只能使用一次?这似乎迫使授权服务器的实现者使用 ACID 数据库,这引入了可扩展性问题。放宽这一限制将允许完全取消存储。

我可以看到,允许重用验证码意味着如果恶意代理可以获取未过期的代码,他们就可以获得对 protected 资源的访问权限。但是 OAuth 2.0 对一些交易强制要求使用 TLS 并推荐给所有交易,这降低了代码被盗的风险,并且假设有一个代理可以监听 channel ,这个要求引入了拒绝服务的可能性(代理可以简单地提交他们发现的任何身份验证代码。)根据具体情况,DoS 的威胁可能大于或小于泄露 secret 。

最佳答案

希望这有助于为您的问题找到原因:
授权过程使用两个授权服务器端点
(HTTP 资源):

o 授权端点 - 由客户端用于获取
来自资源所有者的授权 通过用户代理重定向。

o token 端点 - 由 使用客户端交换授权码 对于访问 token ,通常是 带客户端认证 .
Reference

同样按照 Sec 3.2.1

客户端身份验证至关重要
当授权码传输到重定向时
端点通过不安全的 channel 或重定向 URI 具有
没有被完全注册。

Reference

为了达到上述目的,它遵循五个步骤
enter image description here

如图所示的流程包括以下步骤:

(A) 客户端通过引导资源所有者的
用户代理到授权端点。客户包括
它的客户端标识符、请求的范围、本地状态和一个
授权服务器将向其发送重定向 URI
一旦访问被授予(或拒绝),用户代理就会返回。

(B) 授权服务器对资源所有者进行身份验证(通过
用户代理)并确定资源所有者是否
授予或拒绝客户端的访问请求。

(C) 假设资源所有者授予访问权限,则授权
服务器使用以下命令将用户代理重定向回客户端
之前提供的重定向 URI(在请求中或在
客户注册)。重定向 URI 包括一个
客户端提供的授权码和任何本地状态
早些时候。

(D) 客户端向授权请求访问 token
服务器的 token 端点,包括授权代码
上一步收到。在提出请求时,
客户端向授权服务器进行身份验证。客户端
包括用于获得授权的重定向 URI
验证码。

(E) 授权服务器对客户端进行身份验证,验证
授权码,并确保重定向 URI
接收到匹配用于重定向客户端的 URI
步骤(C)。如果有效,授权服务器响应
访问 token 和可选的刷新 token 。

关于oauth - 为什么 OAuth 2.0 规范禁止重复使用授权代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26425578/

相关文章:

authentication - 如何实现 OAuth 2 服务器

oauth - YouTube授权代码交换失败,并带有redirect_uri_mismatch

oauth - 请求的身份验证凭据无效。预期的 OAuth 2 访问 token 错误

authentication - 管理 Facebook 身份验证 token

node.js - 在 OAuth2 身份验证调用和重定向调用之间传递值

javascript - IdentityServer3 和 Javascript 的隐式流程 - 如何处理 client_secret

spring-boot - 带有松弛度的 Spring Boot Oauth2

grails - 是否可以使用oAuth 2.0文档?

python - 在 Django 中从 facebook 的服务器端身份验证捕获 access_token

java - AuthorizationServerConfigurerAdapter 外部的 ClientDetailsS​​ervice java 配置