我正在使用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
的支票就可以了。发行人如何检查可能失败?
答案 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();