关于解码:转换由Java JWT在python中创建的JWT令牌

Convert JWT token created by Java JWT in python

我已经收到由Java程序使用jjwt模块创建的JWT令牌。
现在,当我尝试使用pyjwt验证令牌时,它将引发异常。

1
2
3
4
import jwt token
token='eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMDAiLCJyb2xlcyI6IkJVU0lORVNTVVNFUiIsIm1vZGUiOiJzdG9yZWFwcCIsImlhdCI6MTQ5NDg1ODk4MCwiZXhwIjoxNDk0ODY0OTgwfQ.ckFnGv1NT-Ui2S90DNr50YoHSXc1ZLBNnEErnGMWL-E'
secret ='123456AB'
jwt.decode(token,secret,algorithms='HS256')

Traceback (most recent call last): File"", line 1, in
File
"/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jwt.py",
line 64, in decode
options, **kwargs) File"/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jws.py",
line 116, in decode
key, algorithms) File"/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jws.py",
line 186, in _verify_signature
raise DecodeError('Signature verification failed') jwt.exceptions.DecodeError: Signature verification failed

如果我在jwt.io中使用相同的令牌,并且选中了base64加密选项,则它似乎可以工作。


这是因为Java创建令牌时,它认为您用作机密的纯文本是base64编码的。 我假设Java期望字符串密钥是某些二进制文件的base64编码版本。 在解码jwt之前,尝试对base64进行解密。

1
2
3
4
5
6
7
import base64
jwt.decode(token,base64.b64decode(secret))

#The token in your question was expired so I ended up passing verify expiration = False
jwt.decode(token,base64.b64decode(secret), options={ 'verify_exp': False})

{u'iat': 1494858980, u'exp': 1494864980, u'sub': u'100', u'roles': u'BUSINESSUSER', u'mode': u'storeapp'}


您可以尝试使用与Java应用程序中相同的SecretKey来验证Python应用程序中传入令牌的签名。