2

jose4j を使用して JWT からネストされたクレームにアクセスできません。クレーム セットが次のような JWT があります。

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

クレーム内のネストされたクレームにアクセスしようとすると、問題が発生しますcontext。を使用して、トップ レベルのクレームに簡単にアクセスできますgetClaimValue

private String qsh;

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

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

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

これらの JWT を付与するサービスがスキーマを大幅に変更する場合、これらのオプションのいずれも特に回復力がないように見えます。

より良い方法はありますか?

4

1 に答える 1

3

それはほぼ正しいです。

クレーム値を Map として取得し、このようにそのコンテンツにアクセスできます (または反復処理します)。

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

を使用flattenClaimsすると、次のようになります。

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

または、すべてを反復して、アプリケーションにとって意味のあるデータ構造に変換することもできます。

isClaimValueOfType(...)のようなものやhasClaim(...)、そのようなものを使用して、クレーム JSON の変更に対する回復力を高めることができますJwtClaims

または、必要getRawJson()に応じて onを使用しJwtClaimsて、選択した JSON プロセッサに JSON を渡すこともできます。

于 2016-04-20T19:53:00.143 に答える