2017-05-29 210 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應用程序中的傳入令牌的簽名。