2017-02-17 13 views
2

Я использую весеннюю защиту OAuth2 с помощью токенов JWT в течение некоторого времени, но теперь мне нужно добавить 2 пользовательских значения в токен JWT.Добавление данных пользователя в полезную нагрузку JWT для весенней безопасности OAUth2

Итак, когда я добавил дополнительный набор параметров в запрос/oauth/token? Grant_type = client_credentials & user_value = 1234567890.

Пользователь user_value выше был для демонстрационных целей. Я могу проследить все это до своего CustomTokenEnhancer (я связал это как способ передать эту информацию на всем протяжении). Все параметры запроса видны через аутентификацию OAuth2Authentication, которая передается моему CustomTokenEnhancer.

Теперь я могу добавить эту информацию к дополнительной информации, которую я вижу, возвращенной ко мне как часть запроса маркера. Смотри ниже.

{ 
    "access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsicGhpLWFwaSJdLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwib3JnYW5pemF0aW9uIjoicGhpLXVzZXJtZ3RuIiwidXNlcl90b2tlbiI6IjEyMzQ1Njc4OTAiLCJleHAiOjE0ODczNjc2NzEsImF1dGhvcml0aWVzIjpbIlJPTEVfQ0xJRU5UIl0sImp0aSI6IjFlZDMzZTAxLTc1ZGUtNDNjZC1hMzk2LTFkMzk2N2Y1NDQ5OCIsImNsaWVudF9pZCI6InBoaS11c2VyIn0.p628BNaaGljypEcGXZMkstNeTN-221qzzNQQ0npxDLTszWaXkgXqsBnBbKf9XMEtWTeCQkIszC9ne1Ei2X5IWTskhLT9Rko-8K7Jq-mXUc6HJZW-3tGV5rRer8Eyyw1wysW9Jiyp7sPkN-TIx12A70f_LHm6PrRR4ECppHWADs-2DvYA30p8omT1_RTt2WlqC40mopUN2TBPkb1WulVpOUEpcP358Ox8oVP8VQRSkLGZKB_b0KZAK9KGjLg6WNh8RghZaBuYuJQpITe_0XEBs_JfwrHhcK1IGaoYwSS7IGp3Cima9OMljdzayDKRqlfSl3WhaBuFmD1S37p-OVQL0A", 
    "token_type":"bearer", 
    "expires_in":8967, 
    "scope":"read write", 
    "user_value":"1234567890", 
    "jti":"1ed33e01-75de-43cd-a396-1d3967f54498" 
} 

Но я не хочу, чтобы эти значения были видны таким образом. Я хочу, чтобы они были добавлены в зашифрованный токен.

Я потратил некоторое время на поиски, и неясно, как я действительно это добавлю. Это должно быть возможно, не так ли?

ответ

3

Внутри вашего собственного TokenEnhancer вы должны кодировать его снова:

@Override 
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { 
    // Generate additional Information [...] 


    // Write it to the token 
    ((DefaultOAuth2AccessToken)accessToken).setAdditionalInformation(addInfo); 

    // Encode Token to JWT 
    String encoded = super.encode(accessToken, authentication); 

    // Set JWT as value of the token 
    ((DefaultOAuth2AccessToken) accessToken).setValue(encoded); 

    return accessToken; 
} 

Вы могли разрешите это с помощью методов JwtHelper, но я просто расширил JwtAccessTokenConverter, поэтому я мог просто использовать кодировку и декодировать.

При создании экземпляра маркера энхансер, вы должны добавить к хранилищу информации:

private CustomTokenEnhancer jwtCustomEnhancer() { 
    KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "***".toCharArray()); 
    CustomTokenEnhancer converter = new CustomTokenEnhancer(); 
    converter.setKeyPair(keyStoreKeyFactory.getKeyPair("jwt")); 

    return converter; 
} 
1

Я сделал что-то подобное, передав значение в качестве предоставленного органа с помощью службы пользовательских данных (а не энхансер-токен). На стороне клиента я написал экстрактор для извлечения значений из принципала, введенного весной, как тип OAuth2Authentication. Следующий код в Scala, но вы можете легко адаптироваться к Java:

/** 
 
    * Mix-in to implicitly extract entity or identity from the principal. 
 
    */ 
 
trait AuthorityExtractor { 
 

 
    def _contextName(implicit principal: OAuth2Authentication) = id(principal, "CONTEXT_") 
 

 
    def _entityId(implicit principal: OAuth2Authentication) = id(principal, "ENTITY_ID_") 
 

 
    def _userId(implicit principal: OAuth2Authentication) = id(principal, "USER_ID_") 
 

 
    def _identityId(implicit principal: OAuth2Authentication) = id(principal, "SELF_ID_") 
 

 
    private def id(principal: OAuth2Authentication, prefix: String) = { 
 
    import collection.JavaConversions._ 
 
    principal 
 
     .getAuthorities 
 
     .filter(_.toString.startsWith(prefix)) 
 
     .map(_.toString.substring(prefix.length)) 
 
     .headOption.getOrElse("") 
 
    } 
 

 
}

-1

я продлить JwtAccessTokenConverter класс как это:

public class FooJwtAccessTokenConverter extends JwtAccessTokenConverter { 
    @Override 
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { 
    DefaultOAuth2AccessToken fooAccessToken = new DefaultOAuth2AccessToken(accessToken); 
    fooAccessToken.getAdditionalInformation().put("foo_property", "foo"); 
    return super.enhance(scaAccessToken, authentication); 
    } 

В моем AuthotizationServerConfig я создаю это:

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints 
      .tokenStore(tokenStore()) 
      .accessTokenConverter(accessTokenConverter()) 
      .authenticationManager(authenticationManager); 
} 

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

@Bean 
public JwtAccessTokenConverter accessTokenConverter() { 
    ScaJwtAccessTokenConverter accessTokenConverter = new ScaJwtAccessTokenConverter(); 
    accessTokenConverter.setSigningKey("familia-mgpe"); // Parte da string de validação do token JWT. 
    return accessTokenConverter; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^