本机应用程序的OAuth 2-公共和机密客户端类型之间有什么区别?

本机应用程序的OAuth 2-公共和机密客户端类型之间有什么区别?,oauth,oauth-2.0,Oauth,Oauth 2.0,我试图为web服务实现OAuth 2提供者,然后在其上构建本机应用程序。我还想让第三方开发人员访问API 我已经阅读了OAuth2规范,无法选择正确的流。我还需要对CLI和GUI应用程序进行身份验证 首先,我们有两种客户类型-公开和保密。当然,GUI和CLI应用程序都是公共的。但这两种类型之间有什么区别呢?在这种情况下,如果我只需更改客户机类型就可以获得访问令牌而不需要它,那么我需要客户机_secret吗 我试着看一些流行服务的API实现,比如GitHub。但它们使用HTTP基本身份验证。我不确

我试图为web服务实现OAuth 2提供者,然后在其上构建本机应用程序。我还想让第三方开发人员访问API

我已经阅读了OAuth2规范,无法选择正确的流。我还需要对CLI和GUI应用程序进行身份验证

首先,我们有两种客户类型-公开和保密。当然,GUI和CLI应用程序都是公共的。但这两种类型之间有什么区别呢?在这种情况下,如果我只需更改客户机类型就可以获得访问令牌而不需要它,那么我需要客户机_secret吗

我试着看一些流行服务的API实现,比如GitHub。但它们使用HTTP基本身份验证。我不确定这是个好主意


有什么特别的区别吗?一个比另一个更安全吗?

关于公开客户端和机密客户端之间的区别,请参见其中的说明:

机密客户机是一种能够保存机密信息的应用程序 客户密码保密的世界。此客户端密码为 由授权服务器分配给客户端应用。这个密码 用于向授权服务器标识客户端,以避免 欺诈机密客户端的一个例子可能是web应用程序,其中 只有管理员才能访问服务器并查看 客户端密码

公共客户机是一种不能保存数据的应用程序 客户密码保密。例如,一个移动电话应用程序 或嵌入了客户端密码的桌面应用程序 信息技术这样的应用程序可能会被破解,这可能会揭示 密码。对于在中运行的JavaScript应用程序也是如此 用户浏览器。用户可以使用JavaScript调试器查看 打开应用程序,并查看客户端密码


机密客户端比公共客户端更安全,但您可能无法始终使用机密客户端,因为它们运行的环境受到限制(c.q.本机应用程序、浏览器客户端).

@HansZ的回答是一个很好的起点,因为它澄清了公共和私有客户端应用程序之间的区别:保持客户端机密的能力是一个秘密

但它并没有回答以下问题:我应该为哪些用例使用什么OAuth2概要文件?为了回答这个关键问题,我们需要对这个问题进行更深入的研究

对于机密应用程序,客户机机密通常通过配置(例如,在属性文件中)在带外(OOB)提供。对于基于浏览器的应用程序和移动应用程序,实际上没有机会执行任何配置,因此,这些应用程序被视为公共应用程序

到目前为止,一切顺利。但我不同意这会使这些应用程序无法接受或存储刷新令牌。事实上,SPA和移动应用程序使用的重定向URI通常是
localhost
,因此,100%等同于响应资源所有者密码凭据授予(ROPC)而直接从令牌服务器接收令牌

许多作者指出,OAuth2实际上并不进行身份验证,这有时是正确的。事实上,正如OAuth2 RFC 6749所述,执行身份验证需要ROPC和客户认证(CC)授权。见和

但是,对于
授权代码
隐式
授权,该语句是正确的。但是,这些域的身份验证实际上是如何工作的呢

通常,用户在浏览器表单中输入用户名和密码,并将其发布到身份验证服务器,该服务器为其域设置cookie。抱歉,即使在2019年,cookies也是最先进的身份验证技术。为什么?因为cookies是浏览器应用程序维护状态的方式。它们没有任何问题,浏览器cookie存储相当安全(受域保护,JS应用程序无法获取“仅http”cookie,安全需要TLS/SSL)。Cookie仅允许在第一次授权请求时显示登录表单。之后,将重新使用当前标识(直到会话过期)

好的,那么上面的和ROPC有什么不同呢?不多不同之处在于登录表单的来源。在SPA中,已知应用程序来自TLS/SSL认证服务器。因此,这几乎等同于由服务器直接呈现表单。无论哪种方式,您都可以通过TLS/SSL信任站点。对于移动应用程序,已知表单是由应用程序开发人员通过应用程序签名提供的(来自Google Play、Apple Store等的应用程序已签名)。因此,还有一种类似于TLS/SSL的信任机制(没有更好的,也没有更糟的,取决于存储、CA、受信任的根分布等)

在这两种情况下,都会返回一个令牌,以防止应用程序在每次请求时都必须重新发送密码(这就是HTTP基本身份验证不好的原因)

在这两种情况下,身份验证服务器都必须经过加固,以抵御任何面向Internet的登录服务器所遭受的攻击。授权服务器没有那么多问题,因为它们委托身份验证。然而,OAuth2
password
client\u凭证
配置文件都充当事实上的身份验证服务器,因此,确实需要严格执行

为什么您更喜欢ROPC而不是HTML表单?非交互案例(如CLI)是常见的用例。大多数CLI都可以被视为机密,因此应该同时具有
client\u id
client\u secret
。注意,如果在共享操作系统实例上运行,则应编写CLI以从文件中提取客户端机密和密码,或至少从标准输入中提取客户端机密和密码,以避免机密和密码显示在进程列表中

本机应用程序和SPA是另一个很好的用途,imo,因为这些应用程序需要令牌才能传递给REST服务。但是,如果这些应用程序需要