客户端密码 + 刷新 spring oauth2 中的访问令牌

Client secret + refreshing the access token in spring oauth2

我正在使用 spring 启动作为后端,Android 设备作为我系统的前端。 现在我面临着使用 Spring-OAuth2 来保护我的资源服务器的挑战。
我有一些问题想和你一起讨论:
My knowledge + this tutorial are saying that I should use the OAuth2.0 "password" grant type for my mobile app to obtain an access token. The official spring tutorial for security 举例说明如何使用密码授予类型获取访问令牌:

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

这是我的第一个问题:是否有可能在不发送 "client secret" 的情况下使用密码授予类型获取访问令牌?
由于通过反编译客户端应用程序,客户端密码可能是 "reverse engineered"。获取没有秘密的访问令牌应该是有可能的,因为 Android 的 Facebook SDK 也不需要移动应用程序中的 client_secret。
我想这里我有点难以理解为什么上面的请求中需要包含clientID + clientSecret,因为,既然已经包含了username + password,那么应该可以生成access token,所以这是否带来了下一个安全级别?并且它是否暗示以下内容(示例):我在我的 Android 客户端中以 Filip 身份登录,并且我将访问令牌 A 与每个请求一起发送到服务器。然后我以 Filip 身份登录 Web 客户端,并尝试使用访问令牌 A 从 Web 客户端访问资源服务器,这是不可能的,因为访问令牌 A 仅针对 Android 客户端发出?

下一个问题是如何刷新获得的访问令牌?
我试图使用下面的命令这样做,但我得到 "Full authentication is required to access this resource." 在我获得新的刷新令牌后,我可以使用刷新令牌再次刷新我的新访问令牌吗?

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 规范允许所谓的 public 客户端,即不对自己进行身份验证的客户端。因此,可以将资源所有者密码凭证授予 public 客户端,即不需要发送客户端密码的客户端。这确实意味着授权服务器无法假设有关客户端的任何信息,因为 client_id 不是秘密,并且无法阻止恶意客户端使用此授权类型或客户端相互冒充。因此,以这种方式使用它是以降低安全性为代价的,尽管有人可能会争辩说,在您的情况下无论如何都无法使用机密客户端,因此没有区别。

一般来说,资源所有者密码凭证授予是 OAuth 的反模式,仅用于迁移目的,因为它本身违背了 OAuth 的大部分目标。

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

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