JJWT:如何正确解析声明?

标签 jjwt

我使用类似以下代码的内容做了一个测试 JWT

String 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();

“perms”是一个自定义声明,其中包含一个字符串数组列表(权限)。

因此,当我收到返回的 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]}

我的问题是:这是收回 claim 的正确(预期)方式吗?从现在开始,我似乎需要使用自定义方法来解析结果,但我认为这不是预期的方式。

谢谢。`

最佳答案

我找到了一种解决方案,不确定是否是预期的解决方案,但它有效。我需要使用

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");

我认为我可以抑制未经检查的转换的警告,因为自从我创建了具有相同值类的自定义声明以来,我知道会发生什么。现在, token 中的声明已正确解析为我可以使用的变量。

关于JJWT:如何正确解析声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44171345/

相关文章:

java - 如何根据 URL 创建 JWT 过滤器异常(exception)

java - 使用 JJWT 从 Xero 解析 RS256 JWT

java - 通过 JJWT 解密 JSON 字符串并删除引号 -Java

authentication - jwt:为什么验证JWT token 时不需要签名算法?

java - nimbus-jose-jwt 和 io.jsonwebtoken - 选择哪个 jjwt 库,为什么?

java - 在 Web 服务之间共享 JJWT 签名

java - 使用 Java JJWT 签名生成在 jwt.io 调试器中失败

java - 验证从 php 生成的 jwt token 时,Jjwt 抛出签名错误

java - 如何从 io.jsonwebtoken.Claims 转换为 java.util.Map<String,Object>?