OAuth 2.0指定了两个client types:
-
public(client_id)
-
机密(client_id:client_secret)
和第2.2节说:
客户端标识符不是秘密;它暴露给资源所有者,不得单独用于客户端身份验证 .
虽然我很清楚公共客户主要用于隐式流程,但这比看起来更多 . 在执行身份验证代码流时,我们首先使用client_id请求授权 endpoints ,不需要密码 . 然后,在获得用户的同意和授权代码后,我们request the token endpoint . 根据规范,我们可以在没有client_secret的情况下请求此 endpoints :
client_id
如果客户端未通过身份验证,则需要
授权服务器,如第3.2.1节中所述 .
如果客户端类型是机密的或客户端已获得客户端凭证(或分配了其他身份验证要求),则客户端必须使用授权服务器进行身份验证,如第3.2.1节中所述 . ......授权服务器必须:......
o确保授权代码已颁发给经过身份验证的代码
机密客户,或者如果客户是公开的,请确保
代码已发送到请求中的“client_id”,
所以基本上这部分说我们能够在没有客户端秘密的情况下请求此 endpoints . 现在,除了那些可能包含在请求中的刷新令牌之外,它没有说什么 .
因为刷新令牌通常是用于请求其他访问令牌的持久凭证,所以刷新令牌绑定到发布它的客户端 . 如果客户端类型是机密的或客户端已获得客户端凭证(或分配了其他身份验证要求),则客户端必须使用授权服务器进行身份验证,如第3.2.1节中所述 .
所以基本上我们可以在没有客户端身份验证的情况下刷新访问令牌 .
现在,令我困惑的是implicit flow不允许发布刷新令牌:
授权服务器不得发出刷新令牌 .
它没有明确说明为什么我们不能允许.2362734_不允许 . 我的理由是,这不是值得信赖的 . 但是,由于公共客户端允许授权代码流,为什么我们实际上需要隐式流,如果使用公共客户端可以实现相同的事情,还有获取刷新令牌?
如果有人能澄清这一点,我会很高兴的 .
1 回答
您可以在没有客户端密码的情况下请求/刷新访问令牌,风险自负 . 或者我们可以说这取决于您的安全要求 . 该规范仅阐明了机密客户端的客户端身份验证,基本上如果客户端是机密的 . 它必须由服务器进行身份验证 .
对于公众客户,规范说:
因此,公共客户甚至无法通过身份验证进行身份验证 . 然后规范还说:
你也可以看看PKCE .
回到你的问题,我认为你是误解:
不太对,您必须对机密客户端进行身份验证,并且您无法使用客户端密钥(没有客户端密钥)对公共客户端进行身份验证 .
我认为这完全是安全问题 . 在隐性拨款中,我们在可能不安全的环境下运营 . 公开刷新令牌可能会损害您的系统,因为我们已经在此授权类型中公开了访问令牌(请阅读security consideration for access token) .
它们完全是为了不同的用例 . 来自https://oauth.net/2/grant-types/implicit/
最后,我建议您使用this site来更好地了解不同的授权类型 .