前几天收到业主的一个需求,要求下属单位的系统不再使用各自的登录系统进行登录,要统一登录接口,对方是Java语言,这边是Python语言,由于语言的不同导致对方生成的token值无法解析成功,一直报“jwt.exceptions.InvalidSignatureError: Signature verification failed”这个异常,查了好多资料,才发现Java在生成token时会使用base64进行深层加密,而Python恰好没有,导致Python无法解析成功。一番百度之后,资料也很少,只有一个博客提到了先对密钥使用base64的decodebytes方法进行解析,在Python中加上这步逻辑就行了

JWT_SALT = base64.decodebytes(SALT.encode('utf8'))

经过尝试后发现还是无法解决,反而又出了新的问题

binascii.Error: Incorrect padding

我又找了这个问题的解决方案,后来决定放弃,因为此解决方案会改变原密钥,所以最终结果还是会导致token解析失败,当然,如果你的密钥刚好是4的倍数,这个方案还是可行的。

后来,我将token值进行了对比,先将token值按照“.”分割成列表,发下相同的密钥加密的token值的下标0的值和下标2的值是相同的,也就是下标1是咱们需要的主体部分,兵行险着,将索引1取出来,再次使用base64.
decodebytes 进行解析

a = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJsb2dpbk5hbWUiOiJsaXV6aGVuIiwiZXhwIjoxNjM1NDEwNDk1fQ.y_A4NJa1ESeu1J8WIXCYG6amiB_fy6hSWt3-QxPLNdugqmLH7q6bnJE4OEq4q-vh_8jFtpisRQU_-0hVMaD_Rg'

miss = 4 - len(a.split(".")[1]) % 4
a = a.split(".")[1] + "=" * miss
a = base64.decodebytes(a.encode("utf8")).decode()
print(a, type(eval(a)))

这里还是需要补齐4的倍数,不会影响解析结果,由于得到的结果是str,需要转回原来的格式,打印结果为:

{"loginName":"liuzhen","exp":1635410495} <class 'dict'>

到此,问题是解决了,但是应该不是最优解决方案,如果你们有更好的解决方案,还请留言,大家一起讨论,谢谢

打赏

发表评论

邮箱地址不会被公开。 必填项已用*标注