Spring OAuth2在发送刷新令牌时要求输入密码
Posted
技术标签:
【中文标题】Spring OAuth2在发送刷新令牌时要求输入密码【英文标题】:Spring OAuth2 asking for password when sending refresh token 【发布时间】:2017-12-06 23:00:00 【问题描述】:我第一次尝试在 Spring Boot 中使用 OAuth2。
基础设施正在运行,但是,当授权令牌过期并且我发送刷新令牌以获取新令牌时,系统还会要求我输入用户名和密码。
问题:刷新令牌不应该足以获得新的授权令牌吗?否则我需要存储用户凭据,这听起来不对。
这是我完全搞错了吗?
谢谢!
我的资源服务器配置:
@Configuration
@EnableResourceServer
public class OAuth2ConfigResource extends
ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
http
.requestMatchers()
.antMatchers("/**")
.and()
.authorizeRequests()
.antMatchers("/api/secure/**")
.access("#oauth2.clientHasRole('ADMIN')")
.antMatchers("/api/public/**")
.access("#oauth2.clientHasRole('USER')");
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception
resources.tokenStore(tokenStore());
@Bean
public TokenStore tokenStore()
return new JwtTokenStore(jwtAccessTokenConverter());
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter()
JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
return tokenConverter;
我的 AuthServer 配置:
@Configuration
@EnableAuthorizationServer 公共类 OAuth2AuthorizationConfig 扩展 AuthorizationServerConfigurerAdapter
@Autowired
@Qualifier("userDetailsService")
private UserDetailsService userDetailsService;
@Autowired
private AuthenticationManager authenticationManager;
private int expiration = 60;
@Bean
@Autowired
public PasswordEncoder passwordEncoder(@Value("$jwt.secret") String secret)
return new StandardPasswordEncoder(secret);
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
oauthServer.allowFormAuthenticationForClients();
@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception
configurer.authenticationManager(authenticationManager);
configurer.userDetailsService(userDetailsService);
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
clients.inMemory()
.withClient("user1")
.secret("pass1")
.accessTokenValiditySeconds(expiration)
.authorities("ADMIN", "USER")
.scopes("read")
.authorizedGrantTypes("password", "refresh_token", "client_credentials")
.and()
.withClient("user2")
.secret("pass2")
.accessTokenValiditySeconds(expiration)
.authorities("USER")
.scopes("read")
.authorizedGrantTypes("password", "refresh_token", "client_credentials");
用法:
1.获取令牌
curl -X POST --user 'user2:pass2' -d 'grant_type=password&username=user2&password=pass2' http://localhost:8080/oauth/token
2.访问 API
curl -i -H "Accept: application/json" -H "Authorization: Bearer 260480f7-3e94-4811-a49d-b385dff83f4a" http://localhost:8080/api/public/request/felipe
3.使用刷新令牌获取新的身份验证令牌
curl -X POST --user 'user2:pass2' -d 'grant_type=refresh_token&refresh_token=48c9f1db-9252-47a0-9a28-091caa775e4c' http://localhost:8080/oauth/token
如前所述,此基础架构运行良好,但是,我不明白为什么我应该在使用刷新令牌时传递凭据(假设没有变通办法),因为据我所知,此令牌只是为了防止 -凭证的展示。
【问题讨论】:
测试全部在样本中?分享你的配置?通过编辑您的问题 您使用哪个流程生成了 access_token? @tgkprog 配置在那里。 @Gab,我正在使用密码流程。 【参考方案1】:1。用户凭据
username
和 password
是指定用户凭据(用户 ID 和密码)的参数。
grant_type=password&username=User-ID&password=Password
2。客户凭证
Authorization
包含在令牌端点请求中的标头包含客户端凭据(客户端 ID 和客户端密码)。
--user 'Client-ID:Client-Secret'
3。推荐
您应该更改以下代码:
.withClient("user2")
.secret("pass2")
到
.withClient("clientId2")
.secret("clientSecret2")
避免混淆。
【讨论】:
以上是关于Spring OAuth2在发送刷新令牌时要求输入密码的主要内容,如果未能解决你的问题,请参考以下文章
授权代码流后,Spring OAuth2 服务器没有响应刷新令牌
是否可以在 Spring Security 中仅使用刷新令牌请求访问令牌 oauth2?没有基本身份验证?
如何在spring security oauth2中分离访问令牌和刷新令牌端点