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 jwt

jwt.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中JWT生成token字符串,在python中解析报错Signature verification failed


回答:

我遇到了一样的问题,看了 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

回到顶部