Spring OAuth2在发送刷新令牌时要求输入密码

时间:2017-07-03 15:42:04

标签: oauth oauth-2.0 spring-security-oauth2

我一直试图在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

如上所述,这个基础设施运行完美,但是,我不明白为什么我应该在使用刷新令牌时传递凭据(假设没有解决方法),因为这个令牌只是为了防止 - 据我所知 - 证书的阐述。

1 个答案:

答案 0 :(得分: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")

避免混淆。