Проверка издателя Json Web Token не работает - PullRequest
0 голосов
/ 24 января 2019

Я делаю что-то очень простое с JWT - я следую уроку здесь .Я использую библиотеку JWT здесь https://github.com/jwtk/jjwt

Код:

    final Claims claims = new DefaultClaims()
            .setExpiration(new Date(LocalDateTime.now().plus(60, DAYS).toEpochSecond(UTC) * 1000));

    Map<String, String> extraInfo = ImmutableMap.of("admin", "true");
    claims.putAll(extraInfo);

    String jwt = Jwts.builder().setIssuer("mycompany").setClaims(claims).signWith(HS512, secretKey).compact();

    Jwts.parser()
            .requireIssuer("mycompany")
            .require("admin", "true")
            .setSigningKey(secretKey)
            .parseClaimsJws(jwt);

Каким-то образом строка .requireIssuer("mycompany") приводит к MissingClaimException ошибка Expected iss claim to be: mycompany, but was not present in the JWT claims.

Если я уберу эту проверку, проверка для admin: true в порядке.Как проверка эмитента может провалиться?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы переопределяете требования, установленные setIssuer с setClaims. Вы можете исправить это, установив эмитента после настройки претензий.

String jwt = Jwts.builder().setClaims(claims).setIssuer("mycompany").signWith(SignatureAlgorithm.HS512, secretKey).compact();
0 голосов
/ 24 января 2019

Прежде всего, не используйте DefaultClaims непосредственно в вашем коде. Именно из артефакта jjwt-impl должен быть доступен только во время выполнения . Цитирование документации :

JJWT гарантирует семантическую совместимость версий для всех своих артефактов, кроме jjwt-impl.jar. На jjwt-impl.jar такая гарантия не предоставляется, и внутренние изменения в этом .jar могут произойти в любое время. Никогда не добавляйте jjwt-impl.jar в свой проект с compile scope - всегда объявляйте его с runtime scope.


Вы можете просто сделать следующее с Jwts.builder():

String jws = Jwts.builder()
        .setIssuer("mycompany")
        .setExpiration(Date.from(OffsetDateTime.now().plus(60, DAYS).toInstant()))
        .claim("admin", "true")
        .signWith(key)
        .compact();

Jws<Claims> jwsClaims = Jwts.parser()
        .requireIssuer("mycompany")
        .require("admin", "true")
        .setSigningKey(key)
        .parseClaimsJws(jws);

В качестве альтернативы DefaultClaims вы можете использовать Map<String, Object> для хранения любых дополнительных требований, как показано ниже:

Map<String, Object> claims = ImmutableMap.of("admin", "true");

String jws = Jwts.builder()
        .setIssuer("mycompany")
        .setExpiration(Date.from(OffsetDateTime.now().plus(60, DAYS).toInstant()))
        .addClaims(claims) // See the notes below
        .signWith(key)
        .compact();

Jws<Claims> jwsClaims = Jwts.parser()
        .requireIssuer("mycompany")
        .require("admin", "true")
        .setSigningKey(key)
        .parseClaimsJws(jws);

Имейте в виду, я использую addClaims(), а не setClaims():

  • addClaims(): добавит указанные претензии к претензиям, уже присутствующим в токене.
  • setClaims(): заменит существующие претензии на указанные.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...