2016-04-19 11 views
2

Ich habe Probleme beim Zugriff auf verschachtelte Ansprüche von einem JWT mit jose4j. Ich habe einen JWT, deren Anspruch Satz wie folgt aussieht:Zugriff auf verschachtelte JWT-Ansprüche mit jose4j

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

ich in Probleme laufen bin, wenn ich versuche den Zugriff auf und der verschachtelten Ansprüche innerhalb des context Anspruch. Ich kann mit der auf Top-Level-Ansprüche leicht zugreifen.

private String qsh; 

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

Es scheint, als ob ich zwei Optionen habe, wenn ich einen verschachtelten Anspruch bekommen möchte.

Die erste Möglichkeit besteht darin, einen Weg zu finden, den Anspruch context als Map<String,Object> zurückzugeben und jeden Anspruch aus diesem Objekt herauszuziehen. Die andere Option besteht darin, flattenClaims zu verwenden, um alle Ansprüche in eine Map<String,List<Object>> zu reduzieren und das erste Objekt aus der Karte für die verschachtelten Ansprüche abzurufen.

Keine dieser Optionen scheint besonders belastbar, wenn der Dienst, der diesen JWTs gewährt, das Schema sehr ändert.

Gibt es einen besseren Weg?

Antwort

2

Das ist ungefähr richtig.

Sie können den Anspruchswert als Map abrufen und auf dessen Inhalt zugreifen (oder ihn iterieren).

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

flattenClaims verwenden könnte wie folgt aussehen:

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

Oder man könnte die ganze Sache durchlaufen und wandelt es zu, was Datenstruktur sinnvoll für Ihre Anwendung macht.

Sie könnten wahrscheinlich Dinge widerstandsfähiger gegen Änderungen in den Ansprüchen JSON mit Dingen wie isClaimValueOfType(...) und hasClaim(...) und solche Dinge auf JwtClaims.

Oder Sie können auch getRawJson() auf JwtClaims verwenden und den JSON an den JSON-Prozessor Ihrer Wahl übergeben, wenn Sie möchten.