你有几个问题,让我们一一回答。
OAuth2 中密码授权类型 (ROPC) 的用途是什么?
这种授权类型的主要目标是为存储最终用户的用户名和密码以代表他们访问其他资源的应用程序提供无缝迁移到 OAuth 2.0。存储用户密码是一个很大的禁忌,因此快速迁移是确保开发人员迁移到 OAuth 2.0 的一种好方法。
...使用client_secret 比发送用户名和密码而不发送client_secret 有什么优势?
用户名和密码用于验证最终用户;也就是说,要确保请求来自具有特定身份的用户。 客户端密码,具有类似的用途,用于验证客户端应用程序本身。
优点是您可以相信请求是从已知且受信任的客户端发出的。如果要求能够安全地区分多个客户端,则非常有用。
关于在本机应用程序中使用客户端密码,有人可以反编译并获取密码,您认为这毫无价值是正确的,因为您不能信任这种类型的客户端身份验证。
但是,OAuth2 仅要求将客户端密码用于机密客户端,而对于无法安全维护客户端密码的本机应用程序而言,情况并非如此。在这种情况下,您在没有客户端凭据/秘密的情况下执行 ROPC。
example tutorial from Auth0 about how you can perform a ROPC grant type request 说明了这种可能性。正如您在下面的 sn-p 中看到的,它确实使用了客户端机密参数,因为它假定这是一个非机密客户端:
var options = { method: 'POST',
url: 'https://YOUR_AUTH0_DOMAIN/oauth/token',
headers: { 'content-type': 'application/json' },
body:
{ grant_type: 'password',
username: 'user@example.com',
password: 'pwd',
audience: 'https://someapi.com/api',
scope: 'read:sample',
client_id: 'XyD....23S' },
json: true };