前提: token与secretkey秘钥都是正确的,java解密失败;
JWT签名与本地计算的签名不匹配。JWT有效性无法断言,不应被信任。
错误:
io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
出现这个错误后,debug跟踪,发现是DefaultJwtSignatureValidator.isValid()方法校验失败,
所以,在排除token、secretkey是不是填写错误的原因后,猜测是不是因为token、或secretkey的二进制生成字符串时的字符集不同引起的,因此将
Jwts.parser() .setSigningKey(JWT_OTA_TOKEN_SECRET) // JWT_OTA_TOKEN_SECRET是字符串String .parseClaimsJws(token) .getBody();
改成了
Jwts.parser() .setSigningKey(JWT_OTA_TOKEN_SECRET.getBytes()) // 默认字符集,UTF-8 .parseClaimsJws(token) .getBody();
就解决了。
总结: secretkey的字符集,如果传入的是字符串,则转为byte[]时是采用ASCII的,而生成key是是采用UTF-8的,因此出现了解密异常。
思路:
1、确认token、secretkey的字符集;
2、token、secretkey调用getbytes()时,采用对应的字符集进行转换;