首页 文章

OAuth 2.0中公共客户的限制是什么

提问于
浏览
2

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 . 现在,除了那些可能包含在请求中的刷新令牌之外,它没有说什么 .

Refreshing an access token提到:

因为刷新令牌通常是用于请求其他访问令牌的持久凭证,所以刷新令牌绑定到发布它的客户端 . 如果客户端类型是机密的或客户端已获得客户端凭证(或分配了其他身份验证要求),则客户端必须使用授权服务器进行身份验证,如第3.2.1节中所述 .

所以基本上我们可以在没有客户端身份验证的情况下刷新访问令牌 .

现在,令我困惑的是implicit flow不允许发布刷新令牌:

授权服务器不得发出刷新令牌 .

它没有明确说明为什么我们不能允许.2362734_不允许 . 我的理由是,这不是值得信赖的 . 但是,由于公共客户端允许授权代码流,为什么我们实际上需要隐式流,如果使用公共客户端可以实现相同的事情,还有获取刷新令牌?

如果有人能澄清这一点,我会很高兴的 .

1 回答

  • 1

    您可以在没有客户端密码的情况下请求/刷新访问令牌,风险自负 . 或者我们可以说这取决于您的安全要求 . 该规范仅阐明了机密客户端的客户端身份验证,基本上如果客户端是机密的 . 它必须由服务器进行身份验证 .

    对于公众客户,规范说:

    授权服务器不得为客户端身份验证向本机应用程序或基于用户代理的应用程序客户端发出客户端密码或其他客户端凭据 .

    因此,公共客户甚至无法通过身份验证进行身份验证 . 然后规范还说:

    当无法进行客户端身份验证时,授权服务器应该采用其他方法来验证客户端的身份 - 例如,要求注册客户端重定向URI或征募资源所有者以确认身份 . 在请求资源所有者授权时,有效的重定向URI不足以验证客户端的身份,但可用于在获取资源所有者授权后阻止向伪造客户端提供凭据 .

    你也可以看看PKCE .

    回到你的问题,我认为你是误解:

    根据规范,我们可以在没有client_secret的情况下请求此 endpoints .

    不太对,您必须对机密客户端进行身份验证,并且您无法使用客户端密钥(没有客户端密钥)对公共客户端进行身份验证 .

    授权服务器不得发出刷新令牌 .

    我认为这完全是安全问题 . 在隐性拨款中,我们在可能不安全的环境下运营 . 公开刷新令牌可能会损害您的系统,因为我们已经在此授权类型中公开了访问令牌(请阅读security consideration for access token) .

    但是,由于公共客户端允许授权代码流,为什么我们实际上需要隐式流,如果使用公共客户端可以实现相同的事情,还有获取刷新令牌?

    它们完全是为了不同的用例 . 来自https://oauth.net/2/grant-types/implicit/

    隐式授权类型是公共客户端可以使用的简化流,其中访问令牌立即返回,无需额外的授权代码交换步骤 . 通常不建议使用隐式流(并且某些服务器完全禁止此流) . 自规范最初编写以来,行业最佳实践已经改为建议公共客户端应该使用具有PKCE扩展的授权代码流 .

    最后,我建议您使用this site来更好地了解不同的授权类型 .

相关问题