Wie bekomme ich ein benutzerdefiniertes Feld aus der Nutzlast mit JJWT

OK, ich bin das hinzufügen von ein paar benutzerdefinierte Ansprüche der Traglast, wenn ich generieren die JWT, und ich kann ziehen Sie diese Prima in meine front-end (javascript). Dann habe ich meinen javascript senden Sie eine ajax-call auf eine micro-service und übergibt es den JWT zusammen mit ihm. Ich möchte meine eigenen Ansprüche aus der JWT in den micro-service. Ich mache Folgendes:

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 sieht in der JWT-Inspektor auf dem front-end für meine eigene Behauptung.

{
  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 bin ich in der Lage sein zu ziehen, meine eigene Forderung aus?

  • Ich nahm eine lok, und sah, dass die einzige Umsetzung von JwtParser vorgesehen ist DefaultJwtParser, die sich auf Jacksons ObjectMapper, aber leider nicht aussetzen, erlauben Sie die Anpassung. Auch nicht über Vererbung: Methode readValue ist protected aber immer nur zurück Map für Objekte (siehe hier in der Version 0.7.0) . Es scheint, dass Sie müssten zu implementieren JwtParser sich von Grund auf… oder manuell konvertieren der Karte auf das Objekt :-/
  • In diesem Fall, wie es aussieht, werde ich wechseln-Bibliotheken, es sieht aus wie jose4j behandeln, was ich bin zu wollen tun.
  • haben Sie dagegen die Buchung der jose4j code zum Vergleich?
InformationsquelleAutor Jacob Miles | 2017-06-23



2 Replies
  1. 2

    Wir können Jackson-Objekt-mapper-konvertieren von Forderungen (das ist ein Map<String, Object>), um unsere benutzerdefinierte Ansprüche java-Objekt.

    final ObjectMapper mapper = new ObjectMapper();
    
    Claims jwsMap = Jwts.parser()
           .setSigningKey("SECRET")
           .parseClaimsJws("jwt")
           .getBody();
    return mapper.convertValue(jwsMap, MyCustomClaim.class);

    Auch hinzufügen, dass code, um zu versuchen zu fangen, um sicherzustellen, wir behandeln den Fall der fehlenden oder verfälschten Signatur.

    • bitte fügen Sie einige Erklärungen.
  2. 0

    OK, also ich wechselte mit Jose4J statt JJWT und nach der Arbeit zu bekommen, jedes Ding arbeiten, merkte ich, dass ich wohl getan haben könnte, etwas ähnliches mit JJWT. Also, was ich am Ende dabei war, mit Gson zum durchführen einer JSON-Kodierung des Objekts und die Befestigung der resultierende JSON string als Anspruch. Und so, wenn ich wollte, um eine benutzerdefinierte Behauptung zurück, ich würde extrahieren Sie die Forderung als string und die Verwendung der Gson-Bibliothek zu konvertieren zurück zu POJO.

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.