2017-02-17 3 views
2

Ich benutze eine Spring-Sicherheit OAuth2 mit JWT-Tokens für einige Zeit, aber jetzt muss ich 2 benutzerdefinierte Werte zum JWT-Token hinzufügen.Hinzufügen von Benutzerdaten zur JWT-Nutzlast für Federsicherheit OAUth2

Also, als ich einen zusätzlichen Satz von Parametern der Anfrage/OAUTH/Token hinzugefügt? Grant_type = client_credentials & user_value = 1234567890.

Der obige user_value war für demonstrative Zwecke. Ich kann es bis zu meinem CustomTokenEnhancer verfolgen (ich habe dies als eine Möglichkeit verbunden, diese Information vollständig weiterzuleiten). Alle Anforderungsparameter sind über die OAuth2Authentication-Authentifizierung sichtbar, die an meinen CustomTokenEnhancer übergeben wird.

Jetzt kann ich diese Informationen zu den zusätzlichen Informationen hinzufügen, die ich als Teil der Token-Anfrage zurückgegeben habe. Siehe unten.

{ 
    "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" 
} 

Aber ich möchte nicht, dass diese Werte auf diese Weise sichtbar sind. Ich möchte, dass sie dem verschlüsselten Token hinzugefügt werden.

Ich verbrachte einige Zeit suchen und es ist nicht klar, wie ich das tatsächlich hinzufügen. Das sollte möglich sein, oder?

Antwort

3

In Ihrem eigenen TokenEnhancer müssen Sie es kodieren wieder:

@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; 
} 

Sie könnten Lösen Sie dies mit den JwtHelper Methoden, aber ich erweiterte einfach JwtAccessTokenConverter, also konnte ich nur codieren und dekodieren.

Wenn Ihr Token Enhancer instanziiert wird, haben Sie die Schlüsselspeicherinformationen hinzuzufügen:

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

    return converter; 
} 
1

Ich habe etwas ähnliches den Wert übergeben als eine erteilte Autorität mit Hilfe von Benutzer-Details-Service (nicht der Token Enhancer). Auf der Client-Seite habe ich einen Extraktor geschrieben, um die Werte aus dem Principal abzurufen, die von Spring als Typ OAuth2Authentication injiziert wurden. Der folgende Code ist in Scala, aber Sie können auf Java leicht anpassen:

/** 
 
    * 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

Ich erweitere JwtAccessTokenConverter Klasse wie folgt:

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); 
    } 

In meinem AuthotizationServerConfig ich das schaffen:

@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; 
} 
Verwandte Themen