can I include user information while issuing an access token?

后端 未结 6 658
無奈伤痛
無奈伤痛 2020-11-28 03:58

I have seen in some oauth2 implementations additional information on the response returned by the authorization server when it issues access tokens. I\'m wondering if there

6条回答
  •  借酒劲吻你
    2020-11-28 04:44

    If you are using Spring's JwtAccessTokenConverter or DefaultAccessTokenConverter you can add your custom CustomTokenEnhancer (see first response) and apply it using a TokenEnhancerChain like this:

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    
        TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
        enhancerChain.setTokenEnhancers(Arrays.asList(customTokenEnhancer(), accessTokenConverter()));
    
        endpoints.tokenStore(tokenStore())
                .tokenEnhancer(enhancerChain)
                .authenticationManager(authenticationManager);
    }
    
    @Bean
    protected JwtAccessTokenConverter jwtTokenEnhancer() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("my_signing_key");
        return converter;
    }
    
    @Bean public TokenEnhancer customTokenEnhancer() {
        return new CustomTokenEnhancer();
    }
    

    Another solution is to create a custom TokenConverter that extends Spring's JwtAccessTokenConverter and override the enhance() method with your custom claims.

    public class CustomTokenConverter extends JwtAccessTokenConverter {
    
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    
        final Map additionalInfo = new HashMap<>();
        additionalInfo.put("customized", "true");
        User user = (User) authentication.getPrincipal();
        additionalInfo.put("isAdmin", user.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList()).contains("BASF_ADMIN"));
        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
    
        return super.enhance(accessToken, authentication);
        }
    } 
    

    And then:

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    
        endpoints.tokenStore(tokenStore())
                .tokenEnhancer(customTokenEnhancer())
                .authenticationManager(authenticationManager);
    }
    
    @Bean public CustomTokenConverter customTokenEnhancer() {
        return new CustomTokenConverter();
    }
    

提交回复
热议问题