spring - 客户端密码+在spring oauth2中刷新访问 token

标签 spring spring-security oauth-2.0 spring-oauth2

我的后端使用 spring boot,系统前端使用 Android 设备。 现在我面临着使用 Spring-OAuth2 来保护我的资源服务器的挑战。
我有一些问题想和你一起讨论:
我的知识+ this tutorial说我应该为我的移动应用程序使用 OAuth2.0“密码”授权类型来获取访问 token 。官方spring tutorial for security举例说明如何使用密码授予类型获取访问 token :

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

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

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

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 不是 secret ,并且无法阻止恶意客户端使用此授权类型或客户端相互冒充。因此,以这种方式使用它是以降低安全性为代价的,尽管有人可能会争辩说,在您的情况下无论如何都无法使用 secret 客户端,因此没有区别。

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

访问 token 是根据每个客户端颁发的。

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

关于spring - 客户端密码+在spring oauth2中刷新访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491381/

相关文章:

spring - java.lang.IllegalStateException(未找到方法) : Calling MockMvc. 使用自定义 Filter 在一次测试中执行多次

oauth-2.0 - Salesforce 动态 OAuth 2.0 回调 uri

javascript - 如何在 Nuxt 中使用 Auth0 在后台更新授权 token

google-cloud-platform - 项目中没有使用过API或者被禁用403错误

java - 将外部 JAR 添加到 Eclipse

java - Spring Security 针对本地 Linux 帐户进行身份验证

java - 使用 Spring 进行运行时依赖注入(inject)

java - 为什么 Spring Security 的 BindAuthenticator 需要用户读取权限?

java - spring mvc 匹配 url 并用作变量

java - 在 Spring 应用程序中配置 Hibernate