据我所知,对于我们的客户(移动应用程序),我们可以使用密码授予类型,使用client_id
,client_secret
和用户的用户名和密码授权客户。
我想知道使用client_secret
而不是client_secret
发送用户名和密码有什么好处?
当我们使用client_secret
并且有人只是反编译Android应用程序并获得client_secret
首先拥有它的好处是什么?
答案 0 :(得分:4)
你有几个问题,所以让我们一个接一个。
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中说明。正如您在下面的代码片段中所看到的,它确实使用了client secret参数,因为它假设这是一个非机密客户端:
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 };