2016-04-19 9 views
2

jose4jを使用してJWTからネストされた要求にアクセスする際に問題があります。私がアクセスしcontext請求内側にネストされた特許請求の範囲しようとしたとき、私は問題に実行していますjose4jでJWTのネストされた要求にアクセスする

{ 
    "iss": "awesome.issuer", 
    "iat": 1300819370, 
    "exp": 1300819380, 
    "clm": "string claim", 
    "sub": "batman", 
    "context": { 
     "username": "mpdavis", 
     "firstName": "Michael", 
     "lastName": "Davis 
    } 
} 

:私は、その請求のセットのようになりますJWTを持っています。 getClaimValueで簡単にトップレベルの申し立てにアクセスできます。

private String qsh; 

qsh = jwtClaims.getClaimValue("qsh", String.class); 

ネストされた主張を取得する場合は、2つのオプションがあるようです。

最初の選択肢はcontextクレームをMap<String,Object>として返し、そのオブジェクトから各クレームを引き出す方法を見つけることです。もう1つの選択肢は、flattenClaimsを使用してすべてのクレームをMap<String,List<Object>>にフラット化し、ネストされたクレームのマップから最初のオブジェクトを取り除くことです。

これらのオプションのいずれも、これらのJWTを許可するサービスがスキーマを非常に変更する場合、特に回復力がないようです。

良い方法がありますか?

答えて

2

これは正しいことです。

クレームの価値をマップとして取得し、そのようなコンテンツにアクセスする(または繰り返しを行う)ことができます。

Map<String,List<Object>> flattened = claims.flattenClaims(); 
String username = (String)flattened.get("context.username").iterator().next(); 
String firstName = (String)flattened.get("context.firstName").iterator().next(); 

それとも、全体を反復処理し、アプリケーションのための理にかなってどんなデータ構造に変換することができます:flattenClaimsを使用して

@SuppressWarnings("unchecked") 
Map<String,String> context = claims.getClaimValue("context", Map.class); 
String username = context.get("username"); 
String firstName = context.get("firstName"); 

は、次のようになります。

isClaimValueOfType(...)hasClaim(...)のようなものを含むクレームJSONの変更に対して、より弾力性を持たせることができる可能性があります。そのようなものはJwtClaimsです。

getRawJson()JwtClaimsに設定し、必要に応じてJSONプロセッサを希望のJSONプロセッサに渡すこともできます。

関連する問題