首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JJWT:如何正确解析声明?

JJWT:如何正确解析声明?
EN

Stack Overflow用户
提问于 2017-05-25 10:31:51
回答 1查看 8K关注 0票数 2

我使用类似以下代码的代码进行了JWT测试

代码语言:javascript
复制
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“是一个自定义声明,它包含一个字符串(权限)的ArrayList。

因此,当我收到返回的JWT时,我使用以下代码

代码语言:javascript
复制
try{
Jwt<?, ?> claims = Jwts.parser().setSigningKey("SECRET").parse(jwt); 
System.out.println(claims.getBody().toString());
} catch (SignatureException e){
//Error
}

我得到了一些像这样的东西

代码语言:javascript
复制
{jti=myid, iss=ExampleIssuer, sub=JohnDoe, iat=1495678299, exp=1495678899, perms=[CREATE, VIEW]}

我的问题是:这是找回索赔的正确(预期)方式吗?从现在开始,我似乎需要用一个自定义的方法来解析结果,但我认为不知何故,这不是我想要的方式。

谢谢你。`

EN

回答 1

Stack Overflow用户

发布于 2017-05-26 03:20:32

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

代码语言:javascript
复制
Claims claims = new DefaultClaims();
        try{
            claims = Jwts.parser().setSigningKey("SECRET").parseClaimsJws(jwt).getBody();
        } catch (SignatureException e){
          //Signature error
        }

我可以在声明上使用Map方法,也可以使用内置的方法来恢复单个声明:

代码语言:javascript
复制
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");

我认为我可以在未检查的强制转换上取消警告,因为我创建了具有相同值类的自定义声明,因此我知道在它上面会发生什么。现在,令牌中的声明被正确地解析为我可以使用的变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44171345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档