为什么OAuth2.0中的授权码授予和隐式授予对客户端身份验证不是强制性的

时间:2019-04-16 16:21:08

标签: oauth-2.0

根据RFC6749第4.1.1章:https://tools.ietf.org/html/rfc6749#section-4.1.1 在“授权代码的授权请求授权”规范中, 身份验证仅需要client_id。由于客户端类型可以是公开的,因此这意味着任何人都可以获取授权码,然后在访问令牌请求-https://tools.ietf.org/html/rfc6749#section-4.1.3中使用它。在这里,您只需要提供client_id(是公开的),授权码(可以通过NO认证获得),redirect_uri和grant_type(不用于认证/授权目的),然后就可以获取访问令牌!

我的问题是,为什么对于这种类型的赠款没有任何强制性的授权/身份验证程序,那么拥有这种类型的赠款的目的是什么?隐式赠款中的相同之处。

2 个答案:

答案 0 :(得分:1)

客户端身份验证不是仅强制注册为公共客户端(如Mobile Native Application)的客户端。移动应用程序无法安全地保存客户端机密,因此在授权码授予和隐式授予中不是强制性的。可以将客户端安全地保存在服务器中的客户端应用程序(例如Web应用程序),此类客户端应注册为机密客户端。注册为机密客户端的客户端应同时提供客户端ID和密码以进行客户端身份验证。

答案 1 :(得分:1)

OAuth2服务器在用户身份验证之后和用户批准对客户端的委托权限后发布授权码(由client_id标识)。然后,将身份验证代码作为参数发送到客户端的已注册重定向URI。所以我不知道您所说的“任何人都可以获取授权码”

公共客户端应使用PKCE OAuth2扩展名。用作一次性密码。因此,即使身份验证代码被盗,也无法在不知道令牌端点的code_verifier参数的情况下将其交换为令牌。

如果攻击者使用他人的client_id(假装为客户端)创建了恶意应用程序,则身份验证代码仍将发送到客户端的重定向URL。如果攻击者掌握了该URL处理程序,则可能是OAuth2协议无法解决的问题。