如何在spring-boot oauth2令牌存储中为每个请求获取新令牌

时间:2019-06-12 17:54:09

标签: java spring-boot access-token spring-security-oauth2

我在2.1.5版本的春季启动中使用了oauth2安全性。当我发送发行令牌的请求时,我收到的是与之前相同的令牌。在令牌过期之前,我无法获得令牌。之后,我可以获得一个新令牌,但同样的情况。

我试图将令牌存储从JdbcTokenStore更改为InMemoryTOkenStore。除此之外,我将身份验证机制AuthenticationProvider更改为UserDetailsS​​ervice。但是什么也没发生。

 @Configuration
 public class OAuth2SecurityConfiguration {

@Configuration
@EnableResourceServer
public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    private final TokenStore tokenStore;

    public ResourceServerConfiguration(TokenStore tokenStore) {
        this.tokenStore = tokenStore;
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.tokenStore(tokenStore).resourceId(Constants.SERVER_RESOURCE_ID);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(Constants.API_BASE_PATH + "/**").authenticated()
                .and().csrf().disable();
    }
}

@Configuration
@EnableAuthorizationServer
public static class OAuth2AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    private final AuthenticationManager authenticationManager;
    private final DataSource dataSource;
    private final PasswordEncoder passwordEncoder;

    @Value("${jwt.key.password:my_pay_jwt_password}")
    private String keyStorePassword;

    public OAuth2AuthorizationServerConfiguration(AuthenticationManager authenticationManager, DataSource dataSource, PasswordEncoder passwordEncoder) {
        this.authenticationManager = authenticationManager;
        this.dataSource = dataSource;
        this.passwordEncoder = passwordEncoder;
    }

    @Bean
    public TokenStore tokenStore() {

    return new InMemoryTokenStore();
    }

    @Bean
    public JwtAccessTokenConverter tokenEnhancer() {
        // For getting user information in getPrincipal()
        DefaultUserAuthenticationConverter duac = new DefaultUserAuthenticationConverter();
        DefaultAccessTokenConverter datc = new DefaultAccessTokenConverter();
        datc.setUserTokenConverter(duac);
        JwtAccessTokenConverter converter = new CustomAccessTokenConverter();
        converter.setAccessTokenConverter(datc); // IMPORTANT

        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("static/jwt.jks"), keyStorePassword.toCharArray());
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("jwt"));
        PublicKey publicKey = keyStoreKeyFactory.getKeyPair("jwt").getPublic();
        String publicKeyString = Base64.encodeBase64String(publicKey
                .getEncoded());
        converter.setVerifierKey(publicKeyString);

        return converter;
    }

    @Bean
    @Primary
    public AuthorizationServerTokenServices defaultAuthorizationServerTokenServices() {
        DefaultTokenServices tokenServices = new LockingTokenServices();
        tokenServices.setAuthenticationManager(this.authenticationManager);
        tokenServices.setTokenStore(tokenStore());
        tokenServices.setTokenEnhancer(tokenEnhancer());
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setReuseRefreshToken(false);

        return tokenServices;
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) {
        security
                .checkTokenAccess("permitAll()")
                .tokenKeyAccess("isAuthenticated()")
                .allowFormAuthenticationForClients()
                .passwordEncoder(NoOpPasswordEncoder.getInstance());
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource)
                .passwordEncoder(passwordEncoder);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .reuseRefreshTokens(false)
                .accessTokenConverter(tokenEnhancer())
                .authenticationManager(authenticationManager)
                .tokenStore(tokenStore()).approvalStoreDisabled();
        endpoints.exceptionTranslator(exception -> {
            if (exception instanceof OAuth2Exception) {
                OAuth2Exception oAuth2Exception = (OAuth2Exception) exception;
                if (OAuth2Exception.INVALID_GRANT.equals(oAuth2Exception.getOAuth2ErrorCode())) {
                    oAuth2Exception.addAdditionalInformation("error_description", "Invalid username or password");
                }
                return ResponseEntity
                        .status(oAuth2Exception.getHttpErrorCode())
                        .body(oAuth2Exception);
            } else {
                throw exception;
            }
        });
    }
}

}

0 个答案:

没有答案