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

Java Json Web令牌颁发者验证不起作用,java,jwt,Java,Jwt,我正在用JWT做一些非常基本的事情-我正在遵循教程。我正在使用JWT库 代码是: final Claims claims = new DefaultClaims() .setExpiration(new Date(LocalDateTime.now().plus(60, DAYS).toEpochSecond(UTC) * 1000)); Map<String, String> extraInfo = ImmutableMap.of("adm

我正在用JWT做一些非常基本的事情-我正在遵循教程。我正在使用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);
final Claims=new DefaultClaims()
.setExpiration(新日期(LocalDateTime.now().plus(60天).toepochs秒(UTC)*1000));
Map extraInfo=ImmutableMap.of(“admin”、“true”);
索赔。putAll(外部信息);
字符串jwt=Jwts.builder().setIssuer(“mycompany”).setClaims(claims).signWith(HS512,secretKey).compact();
解析器()
.重新发行人(“mycompany”)
.require(“管理”、“真实”)
.setSigningKey(加密键)
.parseClaimsJws(jwt);
不知何故,
.requireIssuer(“mycompany”)
行导致
丢失claimexception
错误
预期iss声明为:mycompany,但在JWT声明中不存在。


如果我删除此检查,则检查
admin:true
即可。发卡机构的检查怎么可能失败?

首先,不要在代码中直接使用
DefaultClaims
。它来自于
jjwt impl
工件,该工件应仅在运行时可用。引述:

除了
JJWT impl.jar
之外,JJWT保证其所有工件的语义版本兼容性。对于
jjwt impl.jar
没有这样的保证,并且
.jar
的内部更改可以随时发生。切勿将
jjwt impl.jar
添加到具有
compile
作用域的项目中-始终使用
runtime
作用域声明它


使用
Jwts.builder()
,您可以简单地执行以下操作:

请记住,我使用的是
addClaims()
,而不是
setClaims()

  • addClaims()
    :将给定的声明添加到令牌中已经存在的声明中
  • setClaims()
    :将用给定的声明替换现有的声明

您正在使用
setClaims
覆盖
setissor
设置的声明。您可以通过在设置索赔后设置发卡机构来修复此问题

String jwt = Jwts.builder().setClaims(claims).setIssuer("mycompany").signWith(SignatureAlgorithm.HS512, secretKey).compact();
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);
String jwt = Jwts.builder().setClaims(claims).setIssuer("mycompany").signWith(SignatureAlgorithm.HS512, secretKey).compact();