转换由Java JWT在python中创建的JWT令牌

时间:2017-05-29 12:17:56

标签: jwt decode jjwt pyjwt

我收到了一个使用jjwt模块的java程序创建的JWT令牌。 现在,当我尝试使用pyjwt验证令牌时,它会抛出异常。

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

Traceback(最近一次调用最后一次):文件“”,第1行,in      文件   “/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jwt.py”   第64行,在解码中       选项,** kwargs)文件“/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jws.py”,   第116行,在解码中       key,algorithms)文件“/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jws.py”,   第186行,在_verify_signature中       提升DecodeError('签名验证失败')jwt.exceptions.DecodeError:签名验证失败

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

2 个答案:

答案 0 :(得分:1)

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

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'}

答案 1 :(得分:0)

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