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
请参阅我的第二条评论中的解决方案。
我正在努力使用刷新令牌
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
请参阅我的第二条评论中的解决方案。