spring - 在 Spring Security OAuth2 中使用用户名密码授权中的刷新 token 请求新的访问 token

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

我们正在使用用户名密码授权从我们的身份验证服务器获取访问 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/

相关文章:

spring - Spring MVC Java 中的 AuthenticationSuccessHandler 基于 Java 的配置

Spring Security OAuth2 授权服务器/oauth/token - 500 没有处理程序的适配器

java - 自动检测中默认的数据源实现是什么

java - 作业参数正在被缓存

spring - 如何使用 MockMvc 测试 spring Controller 方法?

hibernate - 无法使用从同一 Maven 原型(prototype)创建的两个 SpringMVC Web 应用程序启动 Tomcat 服务器

security - Jasypt StandardPBEStringEncryptor 在 spring bean 配置文件中设置密码

php - Google OAuth 自动登录

java - Spring 启动 oauth2 : No userInfo endpoint - How to load the authentication (Principal) from the JWT access token directly in the client

spring - 如何轮询目录中的文件?