Java中JWT生成token字符串,在python中解析报错Signature verification failed
现在的情况是用户登录在springboot中生成了token字符串,保存在前端内存中。前端在访问另外一个python项目市,在python中想从这个token中解析出保存的信息,在python中解析时一直报错。
Java生成token代码:
public static final String SECRET = "Secret";HashMap<String, Object> map = new HashMap<>();
map.put(ROLE, username);
map.put(USERNAME, username);
String jwt = Jwts.builder()
.setClaims(map)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
python中解析token字符串代码(pyjwt),
import jwtjwt.decode(token, 'Secret', algorithms=['HS512'])
一直报错
raise InvalidSignatureError('Signature verification failed')jwt.exceptions.InvalidSignatureError: Signature verification failed
在stack overflow上面查看相关的问题的时候有人说是要base64解码一次密钥,我试了一下还是不行,反倒是会报出在解码时报错
这个是stack overflow上面相似问题的回答。
请问是我的解析的代码有问题还是其他什么原因。
python版本是3.7.5
pyjwt版本是1.7.1
回答:
java 里面的 SetClaims
自定义了 Claim
,但是在 pyjwt
中好像不支持这种方式。
https://pyjwt.readthedocs.io/...
回答:
我遇到了一样的问题,看了 java 的代码是有一个 base64 的解密操作:
public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) { Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");
byte[] bytes = TextCodec.BASE64.decode(base64EncodedSecretKey);
return signWith(alg, bytes);
}
bytes 就是 jwt 的加密 key,在 python 里我加了这步逻辑之后就可以了:
JWT_SALT = base64.decodebytes(SALT.encode('utf8'))
以上是 Java中JWT生成token字符串,在python中解析报错Signature verification failed 的全部内容, 来源链接: utcz.com/p/937698.html