Как я могу получить пользовательские поля полезной нагрузки, используя 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 ответа:
Мы можем использовать отображение объектов Джексона для преобразования утверждений (которое является
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);