JWT (JWS) - 非对称签名和刷新令牌

JWT (JWS) - Asymmetric signing and refresh token

我正在努力使用刷新令牌

1) JWT token的非对称签名是否支持刷新token的发放?

2) 为什么我的授权服务器没有根据以下配置发出刷新令牌?

@Configuration
@EnableAuthorizationServer
public class AuthorizationServiceConfig extends AuthorizationServerConfigurerAdapter {

    ...

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        TokenEnhancerChain chain=new TokenEnhancerChain();
        chain.setTokenEnhancers(Arrays.asList(tokenEnhancer, accessTokenConverter()));
        endpoints
                .authenticationManager(authenticationManager)
                .tokenStore(jwtTokenStore())
                .tokenEnhancer(chain)
                .accessTokenConverter(accessTokenConverter())
                .reuseRefreshTokens(false);
    }    


    //Assymetric Key Signing
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter=new JwtAccessTokenConverter();
        try{
            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
            SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
            keyPairGenerator.initialize(1024, random);
            KeyPair keyPair=keyPairGenerator.generateKeyPair();
            jwtAccessTokenConverter.setKeyPair(keyPair);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jwtAccessTokenConverter;
    }

    @Bean
    public JwtTokenStore jwtTokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(jwtTokenStore());
        defaultTokenServices.setSupportRefreshToken(true);
        return defaultTokenServices;
    }

}

授权服务器可选择在发布访问令牌时发布刷新令牌。 授权服务器可能支持的授权类型是:authorization_code, password, client_credentials, implicit, or refresh_token。 Spring OAuth2 Boot 应用程序默认为上面列出的所有授权类型流程的客户端提供支持,只要您提供 AuthorizationServerConfigurerAdapter 实现,那么我们需要通过覆盖 configure(ClientDetailsServiceConfigurer clients) 来为客户端指定授权类型AuthorizationServerConfigurerAdapter class 个,如下例:

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception{
            clients.inMemory()
            .withClient("your_client_id")
            .secret("your_client_secret_encoded")
            .authorizedGrantTypes("client_credentials","refresh_token")  <<--- here
            .scopes("user_info")
            .redirectUris(uri_1,uri_2,uri_n);
        }

因此您现在将获得访问令牌和刷新令牌。

有帮助material:read

请参阅我的第二条评论中的解决方案。