Доступ к вложенным утверждениям JWT с помощью jose4j
У меня проблемы с доступом к вложенным заявкам из JWT с помощью jose4j. У меня есть JWT, чей набор претензий выглядит так:
{
"iss": "awesome.issuer",
"iat": 1300819370,
"exp": 1300819380,
"clm": "string claim",
"sub": "batman",
"context": {
"username": "mpdavis",
"firstName": "Michael",
"lastName": "Davis
}
}
У меня возникают проблемы, когда я пытаюсь получить доступ к вложенным утверждениям внутри context
Запрос. Я могу легко получить доступ к заявкам верхнего уровня с помощью getClaimValue
,
private String qsh;
qsh = jwtClaims.getClaimValue("qsh", String.class);
Кажется, у меня есть два варианта, если я хочу получить вложенную заявку.
Первый вариант - найти способ вернуть context
претендовать как Map<String,Object>
и вытянуть каждую претензию из этого объекта. Другой вариант заключается в использовании flattenClaims
чтобы свести все претензии в Map<String,List<Object>>
и возьмите первый объект с карты для вложенных требований.
Ни один из этих вариантов не кажется особенно устойчивым, если служба, предоставляющая эти JWT, сильно меняет схему.
Есть ли способ лучше?
1 ответ
Это примерно так.
Вы можете получить значение претензии в виде карты и получить доступ к ее содержимому, как это (или итерировать по нему).
@SuppressWarnings("unchecked")
Map<String,String> context = claims.getClaimValue("context", Map.class);
String username = context.get("username");
String firstName = context.get("firstName");
С помощью flattenClaims
может выглядеть примерно так:
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();
Или вы можете выполнить итерацию целиком и преобразовать ее в любую структуру данных, которая имеет смысл для вашего приложения.
Вероятно, вы могли бы сделать вещи более устойчивыми к изменениям в JSON утверждений с такими вещами, как isClaimValueOfType(...)
а также hasClaim(...)
и тому подобное на JwtClaims
,
Или вы также можете использовать getRawJson()
на JwtClaims
и передайте JSON процессору JSON по вашему выбору, если хотите.