转换 Java JWT 在 python 中创建的 JWT 令牌
Convert JWT token created by Java JWT in python
我收到了一个由 java 程序使用 jjwt 模块创建的 JWT 令牌。
现在,当我尝试使用 pyjwt 验证令牌时,它抛出异常。
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 加密选项,它似乎可以工作。
您可以尝试在 Python 应用程序 中使用与您在 Java申请。
这是因为当 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'}
我收到了一个由 java 程序使用 jjwt 模块创建的 JWT 令牌。 现在,当我尝试使用 pyjwt 验证令牌时,它抛出异常。
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 加密选项,它似乎可以工作。
您可以尝试在 Python 应用程序 中使用与您在 Java申请。
这是因为当 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'}