2017-02-17 9 views
2

JWTトークンを使用したスプリングセキュリティOAuth2を使用していますが、JWTトークンに2つのユーザー定義値を追加する必要があります。スプリングセキュリティ用のJWTペイロードへのユーザーデータの追加OAUth2

リクエストに/ oauth/token?grant_type = client_credentials & user_value = 1234567890というパラメータを追加しました。

上記のuser_valueは説明のためのものです。私はCustomTokenEnhancer(これをすべての方法でこの情報を渡す手段として接続しました)の中にそれを完全にトレースすることができます。すべてのリクエストパラメータは、私のCustomTokenEnhancerに渡されるOAuth2Authentication認証を通して見ることができます。

ここで、この情報を、トークン要求の一部として返された追加情報に追加することができます。下記参照。

{ 
    "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としてSpringによって注入されたプリンシパルから値を取得するための抽出プログラムを書きました。次のコードは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クラス拡張:

:私はこれを作成して、私のAuthotizationServerConfigで

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

@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; 
} 
関連する問題