Json Web令牌发行者验证不起作用

时间:2019-01-24 13:39:06

标签: java jwt

我正在使用JWT做非常非常基本的事情-我遵循教程here。我在这里https://github.com/jwtk/jjwt

使用JWT库

代码是:

    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 :(得分:0)

首先,请勿在代码中直接使用DefaultClaims。来自jjwt-impl工件,只能在运行时使用。引用documentation

  

JJWT保证除jjwt-impl.jar之外的所有工件的语义版本控制兼容性。 jjwt-impl.jar无法获得任何保证,.jar的内部更改可以随时发生。切勿在{{1​​}}范围内将jjwt-impl.jar添加到项目中-始终在compile范围内声明它。


您可以简单地使用runtime执行以下操作:

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():将现有的声明替换为给定的。

答案 1 :(得分:0)

您正在用setIssuer覆盖setClaims设置的声明。您可以在设置版权声明后通过设置颁发者来解决此问题。

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