我使用spring引导作为后端,使用Android设备作为系统的前端。现在,我面临着使用Spring-OAuth2保护我的资源服务器的挑战。
我有一些问题想和你讨论:
我的知识+ 本教程是说,我应该使用OAuth2.0“密码”授予类型为我的移动应用程序,以获得一个访问令牌。官方安全春季教程给出了一个示例,说明如何使用密码授予类型获得访问令牌:
$ curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd下面是我的第一个问题:是否有可能在不发送“客户端机密”的情况下使用密码授予类型获得访问令牌?
因为客户端秘密可以通过反编译客户端应用程序进行“反向工程”。在没有秘密的情况下获得访问令牌应该是可能的,因为用于安卓的Facebook也不需要移动应用程序中的client_secret。
在这里,我想我很难理解为什么clientID + clientSecret需要包含在上面的请求中,因为已经包含了用户名+密码,所以应该可以生成访问令牌,那么这会带来更高级别的安全性吗?这是否意味着(例如):我在我的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谢谢
发布于 2016-02-18 21:50:36
OAuth 2.0规范允许所谓的公共客户机,即不对自己进行身份验证的客户端。因此,可以在公共客户端(即不需要发送客户端机密的客户端)使用资源所有者密码凭据授予。这确实意味着授权服务器不能假定客户端的任何内容,因为client_id不是秘密,也无法防止使用此授权类型的恶意客户端相互冒充对方。因此,以这种方式使用它是以降低安全性为代价的,尽管有人可能会争辩说,在您的情况下,没有办法使用机密客户端,所以没有区别。
通常,资源所有者密码凭据授予是OAuth的反模式,只用于迁移目的,因为它本身就违背了OAuth的大多数目标。
访问令牌是在每个客户端的基础上发出的。
刷新令牌请求似乎还可以,但是授权服务器可能需要基本的身份验证,而不是将client_id/client_保密作为post参数,考虑到您对原始访问令牌请求也是这样做的。
https://stackoverflow.com/questions/35491381
复制相似问题