我们正在使用用户名密码授权从我们的身份验证服务器获取访问 token 。我们希望在访问 token 过期之前使用提供的刷新 token 刷新访问 token ,直到用户注销或关闭客户端应用程序。
但是我找不到任何有关如何发出此刷新 token 请求的示例..
要获取 token ,我们调用如下:
curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token
所以要刷新,我希望调用看起来像这样:
curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
或许
curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
但它只会给我一个 401..
哦,是的,也许我需要添加 clientId?我不能使用客户端密码,因为没有(请参阅上面的获取 token 的请求)。毕竟身份验证是使用用户名和密码完成的..
我认为我们的服务器配置是正确的,所以我不会在这里发布。如果我的示例请求之一应该有效,并且您需要查看重要的配置部分,我将添加它们。
谢谢!
最佳答案
正如我所说,我们不使用客户端密码,因为我们不能在 Javascript 客户端应用程序中使用它。在使用用户名密码授权时,无论如何都不需要它。 (请参阅我们请求访问 token 的方式)。 事实上,我已经接近解决方案并最终想通了:
curl -v --data "grant_type=refresh_token&client_id=THE_CLIENT_ID&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
所以不需要访问 token 或客户端密码。
总而言之,它感觉足够安全。
- 我们不会在客户端应用端存储任何 secret 。
- 用户总是需要密码才能登录,并且只能看到他们的资源。
- 我们将刷新 token 的有效性限制为一个实际时间,例如工作日或其他时间,这样即使它受到攻击,攻击者的窗口也会受到限制,同时仍然允许用户在很长一段时间内方便地保持与资源服务器的连接 session 。
关于spring - 在 Spring Security OAuth2 中使用用户名密码授权中的刷新 token 请求新的访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19655911/