客户端秘密在Spring OAuth2中刷新访问令牌

Client secret + refreshing the access token in spring oauth2

我在系统的后端使用spring boot,在系统的前端使用Android设备。
现在,我面临使用Spring-OAuth2保护我的资源服务器的挑战。
我有一些问题想与您讨论:
我对本教程的了解是,我应该为我的移动应用程序使用OAuth2.0 " password "授予类型来获取访问令牌。Spring官方安全性教程给出了一个示例,该示例如何使用密码授予类型获取访问令牌:

1
$ curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd

这是我的第一个问题:是否有可能使用密码授予类型获取访问令牌而无需发送"客户端密码"?
由于可以通过反编译客户端应用程序来对客户端密码进行"反向工程"。可以以某种方式获得无秘密的访问令牌,因为适用于Android的Facebook SDK也不需要移动应用程序中的client_secret。
我想在这里我很难理解为什么需要在上面的请求中包含clientID clientSecret,因为既然已经包含了用户名密码,则应该可以生成访问令牌,因此这带来了下一个层次安全 ?并暗示以下内容(示例):我在Android客户端中以Filip身份登录,并且将访问请求A与每个请求一起发送到服务器。然后,我以Filip身份登录到Web客户端,并尝试使用访问令牌A从Web客户端访问资源服务器,这是不可能的,因为访问令牌A仅针对Android客户端发布了?

下一个问题是如何刷新获得的访问令牌?
我试图使用下面的命令来执行此操作,但是获得了"访问该资源需要完全身份验证。"在获得新的刷新令牌之后,我可以使用刷新令牌再次刷新我的新访问令牌吗?

1
curl -v --data"grant_type=refresh_token&client_id=acme&client_secret=acmesecret&refresh_token=REFRESH_TOKEN" http://localhost:9999/uaa/oauth/token

谢谢


OAuth 2.0规范允许所谓的公共客户端,即不对自身进行身份验证的客户端。因此,可以对公共客户端(即不需要发送客户端机密的客户端)使用"资源所有者密码凭据"授予。这确实意味着,由于client_id不是秘密,并且授权服务器无法假设有关客户端的任何信息,因此无法阻止使用此授权类型的恶意客户端或客户端之间的相互模仿。因此,以这种方式使用它是以降低安全性为代价的,尽管有人可能会争辩说,在您的情况下,无论如何都无法使用机密客户端,因此没有区别。

通常,"资源所有者密码证书"授予是OAuth的反模式,仅用于迁移目的,因为它破坏了OAuth本身的大多数目标。

访问令牌是基于每个客户端发行的。

您刷新令牌请求似乎没问题,但考虑到您对原始访问令牌请求也做了相同的操作,授权服务器可能需要基本身份验证,而不是提供client_id / client_secret作为发布参数。