3

我将 spring boot 用于后端,将 Android 设备用于系统的前端。现在我面临着使用 Spring-OAuth2 来保护我的资源服务器的挑战。
我有一些问题想和你讨论:
我的知识+本教程说我应该为我的移动应用程序使用 OAuth2.0“密码”授权类型来获取访问令牌。官方spring 安全教程给出了如何使用密码授权类型获取访问令牌的示例:

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

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

下一个问题是如何刷新获得的访问令牌?
我试图使用下面的命令这样做,但我得到“访问此资源需要完全身份验证”。获得新的刷新令牌后,我可以使用刷新令牌再次刷新我的新访问令牌吗?

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

谢谢

4

1 回答 1

0

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

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

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

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

于 2016-02-18T21:50:36.343 回答