今天做项目的时候,涉及到一个支付记账的功能,想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输,想着要是被中途抓包修改了不就麻烦了,所以考虑到这种安全性的需求,就利用上了JWT来进行数据的封装传递,避免了被中途抓包修改的情况。但是当和前端约定好密钥签名后,发现相同匹配的签名居然无法匹配?!代码如下:
前端代码:
const header = { alg: "HS256", typ: "JWT" };
// 设置JWT有效载荷
const payload = {uid: "wzx",point_amount: 100,pi_sum: 10,exp: Math.floor(Date.now() / 1000) + 600, // 过期时间(当前时间戳加1小时)
};
export function getJWTFun(alg, header, payload) {let token = KJUR.jws.JWS.sign(alg,JSON.stringify(header),JSON.stringify(payload),"pairuan");return token;
}
后端代码:
public static Claims getUserIdFromToken(String token){JwtParser jwtParser = Jwts.parser();// 通过签名对Token进行解析,得到的结果是一个类似集合的封装类Jws<Claims> claimsJws = jwtParser.setSigningKey("pairuan").parseClaimsJws(token);return claimsJws.getBody();}
在上方的代码中可以发现,我俩的签名应该是可以匹配的才对,但是还是报了
JWT signature does not match locally computed signature. JWT validity cannot be asserted and should
的异常。在确定令牌并未过期的基础上,通过几个小时的冲浪,终于找到一个合适的解决方案,那就是将令牌指定编码格式转换为一个byte数组,这样子就可以如愿匹配!!代码如下: