2016-04-19 5 views
2

У меня возникли проблемы с доступом к вложенным запросам из JWT с помощью jose4j. У меня есть JWT, множество претензий выглядит следующим образом:Доступ к JWT вложенным претензиям с jose4j

{ 
    "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, очень сильно изменяет схему.

Есть ли лучший способ?

ответ

2

Это примерно право.

Вы можете получить значение претензии как карту и получить доступ к ее контенту (или повторить его).

@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 по вашему выбору, если хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^