我在后端使用spring boot,在我的系统的前端使用Android设备。
现在,我正面临着使用Spring-OAuth2保护资源服务器的挑战
我有一些问题,我想与你讨论:
我的知识+ this tutorial表示我应该为我的移动应用使用OAuth2.0“密码”授权类型来获取访问令牌。官方spring tutorial for security给出了如何使用密码授予类型获取访问令牌的示例:
$ curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd
这是我的第一个问题:是否有可能使用密码授予类型获取访问令牌而不发送“客户端密码”?
由于可以通过反编译客户端应用程序来“反向设计”客户端密钥。获取访问令牌没有秘密应该是某种可能的,因为Facebook SDK for Android也不需要移动应用程序中的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
谢谢
答案 0 :(得分:0)
OAuth 2.0规范允许所谓的公共客户端,即不对自己进行身份验证的客户端。因此,可以将资源所有者密码凭证授权与公共客户端一起使用,即不需要发送客户端密钥的客户端。这确实意味着授权服务器不能假设客户端的任何内容,因为client_id不是秘密,并且无法阻止使用此授权类型的恶意客户端或客户端模仿彼此。因此,以这种方式使用它会降低安全性,但有人可能会说,在您的情况下,无论如何都无法使用机密客户端,因此没有区别。
通常,资源所有者密码凭据授权是OAuth的反模式,仅用于迁移目的,因为它本身会破坏OAuth的大部分目标。
访问令牌是基于每个客户发布的。
您刷新令牌请求似乎没问题,但授权服务器可能需要基本身份验证,而不是将client_id / client_secret作为post参数提供,考虑到您对原始访问令牌请求执行了相同操作。