2017-05-29 214 views
0

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

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加密选项,则似乎工作。

回答

0

这是因为当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'} 
+0

它工作得像一阵微风!谢谢。 java jjwt包没有清楚地提到我们提供的密钥被假定为base64编码的字符串。 – Palaz

+0

很高兴提供帮助,如果此答案解决了您的问题,请通过单击答案旁边的复选标记将其标记为已接受。有关更多信息,请参阅:https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work。 –

0

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