Как я могу получить пользовательские поля полезной нагрузки, используя JJWT


Хорошо, я добавляю пару пользовательских утверждений к полезной нагрузке, когда я генерирую JWT, и я могу вытащить их просто отлично в моем интерфейсе (javascript). Тогда у меня есть JavaScript и отправить AJAX-вызов на микро-услуги и передает вышлю вместе с ним. Я хочу получить свои пользовательские претензии из JWT в микро-сервисе. Я делаю следующее:

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

И это создает исключение.

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)

Вот как данные выглядят в инспекторе JWT на переднем конце для моего обычая претензия.

{
  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: "jacob@test.net",
    active: true,
    createdDt: 1491355712000,
    createdByUserId: 0,
    lastUpdateDt: 1498199278000,
    lastUpdateByUserId: 0,
    lastLoginDt: 1484928016000
  }
}

Что я упускаю, чтобы иметь возможность вытащить мое обычное требование?

2 2

2 ответа:

Мы можем использовать отображение объектов Джексона для преобразования утверждений (которое является Map<String, Object>) в наш пользовательский объект Java утверждения.

final ObjectMapper mapper = new ObjectMapper();

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

Также добавьте этот код, чтобы попытаться поймать, чтобы убедиться, что мы обрабатываем случай отсутствия / подделки подписи.

Хорошо, поэтому я переключился на использование Jose4J вместо JJWT и после работы, чтобы заставить все работать, я понял, что, вероятно, мог бы сделать что-то подобное с JJWT. В итоге я использовал Gson для кодирования объекта в формате JSON и прикрепления результирующей строки JSON в качестве утверждения. И поэтому, когда я хотел получить пользовательское утверждение обратно, я извлекал утверждение в виде строки и использовал библиотеку Gson, чтобы преобразовать его обратно в 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);