Доступ к вложенным утверждениям 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 по вашему выбору, если хотите.

Другие вопросы по тегам