token系列2—解析(解码)及实际应用

本文详细解析了JWT Token的解析过程,包括DefaultJwtParser类的使用,从切分、头部解析、负载解析到签名解析的步骤。同时介绍了JWT在实际应用中的场景,如生成、获取、验证Token以及处理Claims等操作。
摘要由CSDN通过智能技术生成

解析Token

private static Claims getClaimsFromToken(String token) {
    Claims claims;
    try {
        claims = Jwts.parser()
                .setSigningKey("签名算法的盐值key")
                .parseClaimsJws(token)
                .getBody();
    } catch (Exception e) {
        claims = null;
    }
    return claims;
}

上述代码从JWT Token中获取了负载。

与Builder类似,Jwts.parser() 返回了DefaultJwtParser 对象

DefaultJwtParser 类源码解析
//don't need millis since JWT date fields are only second granularity:
private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static final int MILLISECONDS_PER_SECOND = 1000;

private ObjectMapper objectMapper = new ObjectMapper();

private byte[] keyBytes; //签名key字节数组
private Key key; //签名key
private SigningKeyResolver signingKeyResolver; //签名Key解析器
private CompressionCodecResolver compressionCodecResolver = new DefaultCompressionCodecResolver(); //压缩解析器
Claims expectedClaims = new DefaultClaims(); //期望Claims
private Clock clock = DefaultClock.INSTANCE; //时间工具实例
private long allowedClockSkewMillis = 0;  //允许的时间偏移量

setSigningKey() 与builder中签名方法signWith()对应,parser中的此方法拥有与signWith()方法相同的三种参数形式,用于设置JWT的签名key,用户后面对JWT进行解析。
isSigned() 校验JWT是否进行签名。方法很简单,以分隔符" . ",截取JWT第三段,即签名部分进行判断。

parse() 方法传入一个JWT字符串,返回一个JWT对象。

解析过程:
1、切分。

以分隔符" . "切分JWT的三个部分。
如果分隔符数量错误或者载荷为空,将抛出 MalformedJwtException 异常。

2、头部解析。

将头部原始Json键值存入map。根据是否加密创建不同的头部对象。jjwt的DefaultCompressionCodecResolver根据头部信息的压缩算法信息,添加不同的压缩解码器。

JJWT automatically detects that compression was used by examining the header and will automatically decompress when parsing. No extra coding is needed on your part for decompression.
3、负载解析。

先对负载进行Base64解码,如果有经过压缩,那么在解码后再进行解压缩。
此时将值赋予payload:如果负载是json形式,将json键值读入map,将值赋予claims 。

if (payload.charAt(0) == '{' && payload.charAt(payload.length() - 1) == &#
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值