2017-06-23 3 views
0

OK, ein benutzerdefiniertes Feld auf die Nutzlast ein paar individuelle Ansprüche Hinzufügen ich, wenn ich die JWT generieren, und ich kann diese aus ganz gut in meinem Front-End (Javascript ziehen). Ich lasse dann mein Javascript einen Ajax-Anruf an einen Mikro-Dienst senden und es übergibt das JWT mit ihm. Ich möchte meine persönlichen Ansprüche aus dem JWT im Mikro-Service herausholen. Ich mache folgendes:Wie kann ich aus der Nutzlast erhalten mit JJWT

Claims claims = Jwts.parser().setSigningKey(Vars.SECRET_KEY).parseClaimsJws(token).getBody(); 
User user = claims.get("customuser", User.class); 

und es löst eine Ausnahme aus.

io.jsonwebtoken.RequiredTypeException: Expected value to be of type: class net.netdatacorp.netdauth.model.User, but was class java.util.LinkedHashMap 
    at io.jsonwebtoken.impl.DefaultClaims.get(DefaultClaims.java:128) 

Hier ist, wie die Daten im JWT-Inspektor auf der Front-End für meine benutzerdefinierten Anspruch aussieht.

{ 
    jti: "83bffbad-7d36-4370-9332-21a84f2a3dce", 
    iat: 1498241526, 
    sub: "test", 
    iss: "www.test.net", 
    customuser: { 
    userId: 1, 
    userCd: "TMM", 
    firstNm: "Testy", 
    lastNm: "McTesty", 
    userNm: "test", 
    emailAddress: "[email protected]", 
    active: true, 
    createdDt: 1491355712000, 
    createdByUserId: 0, 
    lastUpdateDt: 1498199278000, 
    lastUpdateByUserId: 0, 
    lastLoginDt: 1484928016000 
    } 
} 

Was vermisse ich, um meinen benutzerdefinierten Anspruch herausziehen zu können?

+0

nahm ich einen lok, und sah, dass die einzige Implementierung von 'JwtParser' vorgesehen ist' DefaultJwtParser', die auf Jackson 'ObjectMapper' beruht, aber leider ist es nicht aussetzen Anpassung zu ermöglichen. Nicht einmal über Vererbung: Methode 'readValue' ist' protected' aber immer nur gibt 'Map' für Objekte ([siehe hier in 0.7.0] (https://github.com/jwtk/jjwt/blob/0.7.0/ src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java # L550-L556)). Es scheint, Sie bräuchten implementieren 'JwtParser' sich von Grund auf neu ... oder manuell die Karte zu Ihrem Objekt konvertieren: -/ –

+0

In diesem Fall sieht es aus wie ich Bibliotheken Schalt werden, es sieht aus wie jose4j handhaben kann, was ich Ich will es tun. –

+0

@JacobMiles, tun Sie das 'jose4j' Code zum Vergleich etwas ausmachen, veröffentlichen? – chenrui

Antwort

0

OK, so wechselte ich zu verwenden Jose4J statt JJWT und nach der Arbeit alles zum Laufen zu bringen mir klar, ich wahrscheinlich etwas ähnliches mit JJWT getan haben könnte. Was ich also getan habe, war die Verwendung von Gson, um eine JSON-Codierung des Objekts durchzuführen und die resultierende JSON-Zeichenfolge als Claim anzuhängen. Und wenn ich einen benutzerdefinierten Anspruch zurückbekommen wollte, würde ich den Anspruch als String extrahieren und die Gson-Bibliothek verwenden, um sie zurück in einen POJO zu konvertieren.

GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 

JwtConsumer jwtConsumer = getConsumer(); 

JwtClaims jwtClaims = jwtConsumer.processToClaims(token); 
String userStr = jwtClaims.getClaimValue("user", String.class); 
User user = gson.fromJson(userStr, User.class); 
Verwandte Themen