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。用户凭据

usernamepassword 是指定用户凭据(用户 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 OAuth2 服务器没有响应刷新令牌

是否可以在 Spring Security 中仅使用刷新令牌请求访问令牌 oauth2?没有基本身份验证?

如何在spring security oauth2中分离访问令牌和刷新令牌端点

Spring oauth2刷新令牌 - 无法将访问令牌转换为JSON

Spring OAuth2 不提供刷新令牌