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

OAuth 2.0中公共客户端的限制是什么,oauth,oauth-2.0,Oauth,Oauth 2.0,OAuth 2.0指定了两个: 公共(客户端id) 机密(客户id:客户机密) 第2.2节说: 客户端标识符不是一个 秘密它向资源所有者公开,不得使用 单独进行客户端身份验证 虽然我很清楚,公共客户机主要用于隐式流,但这比表面上看起来要复杂得多。在执行身份验证代码流时,我们首先使用客户机id请求授权端点,不需要保密。然后,在得到用户的同意和授权代码后,我们就可以开始了。根据规范,我们可以请求此端点,而无需客户端密码: 如果客户类型是机密的,或者客户是已发布的客户 凭据(或指定的其他身份验证要

OAuth 2.0指定了两个:

  • 公共(客户端id)
  • 机密(客户id:客户机密)
第2.2节说:

客户端标识符不是一个 秘密它向资源所有者公开,不得使用 单独进行客户端身份验证

虽然我很清楚,公共客户机主要用于隐式流,但这比表面上看起来要复杂得多。在执行身份验证代码流时,我们首先使用客户机id请求授权端点,不需要保密。然后,在得到用户的同意和授权代码后,我们就可以开始了。根据规范,我们可以请求此端点,而无需客户端密码:

如果客户类型是机密的,或者客户是已发布的客户 凭据(或指定的其他身份验证要求),以及 客户端必须按照所述向授权服务器进行身份验证 在第3.2.1节中

授权服务器必须:

...
o ensure that the authorization code was issued to the authenticated
  confidential client, or if the client is public, ensure that the
  code was issued to "client_id" in the request,
因此,基本上这一节说,我们可以在没有客户机机密的情况下请求这个端点。现在,除了请求中可能包含的刷新令牌之外,它没有提到任何关于刷新令牌的内容

提到:

因为刷新令牌通常是用于 请求其他访问令牌时,刷新令牌将绑定到 向其发出该证书的客户机。如果客户端类型是机密的或 已向客户端颁发客户端凭据(或为其分配其他凭据) 身份验证要求),客户端必须通过 授权服务器,如第3.2.1节所述

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

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

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

它没有明确说明为什么我们不能这样做,只是我们不被允许这样做。我的理由是,这是不允许的,因为客户不可信。但是既然公共客户端允许使用授权代码流,那么如果可以使用公共客户端实现同样的功能,再加上获取刷新令牌,那么为什么我们实际上需要隐式流呢


如果有人能澄清这一点,我将非常高兴。

您可以请求/刷新访问令牌,而无需客户端密码,风险由您自己承担。或者我们可以说,这取决于您的安全要求。该规范仅澄清了机密客户机的客户机身份验证,基本上是在客户机是机密的情况下。它必须由服务器进行身份验证

对于公共客户,规范规定:

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

所以公共客户甚至不能有一个秘密来进行身份验证。规范还说:

当无法进行客户端身份验证时,授权服务器 应采用其他方式验证客户身份——例如 例如,要求注册客户端重定向URI 或登记资源所有者以确认身份。有效的 重定向URI不足以验证客户端的标识 请求资源所有者授权时,但可用于 防止在登录后将凭据传递给伪造的客户端 正在获取资源所有者授权

你也可以看看

回到你的问题上来,我认为你误解了:

根据规范,我们可以请求此端点,而无需客户端密钥

不完全正确,您必须验证机密客户机,并且不能使用客户机机密(它没有客户机机密)验证公共客户机

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

我认为这都是安全问题。在隐式授权中,我们的运营环境可能不安全。公开刷新令牌可能会损害您的系统,因为我们已经公开了此授予类型中的访问令牌(请阅读)

但是既然公共客户端允许使用授权代码流,那么如果可以使用公共客户端实现同样的功能,再加上获取刷新令牌,那么为什么我们实际上需要隐式流呢

它们适用于完全不同的用例。从

隐式授权类型是一种简化的流程,可由公共客户机使用,其中访问令牌将立即返回,而无需额外的授权代码交换步骤

通常不建议使用隐式流(有些服务器完全禁止此流)。自最初编写规范以来,行业最佳实践已经发生了变化,建议公共客户机使用带有PKCE扩展的授权代码流


最后,我建议您与一起玩,以更好地了解不同的补助金类型。

感谢您提供OAuth 2.0游乐场的链接
...
o ensure that the authorization code was issued to the authenticated
  confidential client, or if the client is public, ensure that the
  code was issued to "client_id" in the request,