我使用类似下面的代码
来测试JWTString jwt = Jwts.builder()
.setHeaderParam("typ", "jwt")
.setId("myid")
.setIssuer("ExampleIssuer")
.setSubject("JohnDoe")
.setIssuedAt(Date.from(LocalDateTime.now().toInstant(ZoneOffset.ofHours(-4))))
.setExpiration(Date.from(LocalDateTime.now().toInstant(ZoneOffset.ofHours(-4)).plusSeconds(600)))
.claim("perms",perms)
.signWith(SignatureAlgorithm.HS512, "SECRET")
.compact();
"烫发"是一个自定义声明,其中包含一个字符串ArrayList(权限)。
所以当我收到JWT时,我使用以下代码
try{
Jwt<?, ?> claims = Jwts.parser().setSigningKey("SECRET").parse(jwt);
System.out.println(claims.getBody().toString());
} catch (SignatureException e){
//Error
}
我得到像
这样的东西{jti=myid, iss=ExampleIssuer, sub=JohnDoe, iat=1495678299, exp=1495678899, perms=[CREATE, VIEW]}
我的问题是:这是获得索赔的正确(预期)方式吗?从现在开始,我需要使用自定义方法解析结果,但我认为这不是预期的方式。
谢谢。
答案 0 :(得分:0)
我找到了一个解决方案,不确定是否有预期解决方案,但它确实有效。我需要使用
Claims claims = new DefaultClaims();
try{
claims = Jwts.parser().setSigningKey("SECRET").parseClaimsJws(jwt).getBody();
} catch (SignatureException e){
//Signature error
}
我可以在声明中使用Map方法,但也可以使用内置方法来恢复各个声明:
String jti = claims.getId();
String iss = claims.getIssuer();
String sub = claims.getSubject();
String iat = claims.getIssuedAt().toString();
String exp = claims.getExpiration().toString();
@SuppressWarnings("unchecked")
ArrayList<String> perms = (ArrayList<String>) claims.get("perms");
我认为我可以取消对未经检查的转换的警告,因为因为我创建了具有相同值类的自定义声明,所以我知道对它有什么期望。现在,令牌中的声明被正确解析为我可以使用的变量。