【问题标题】:Convert JWT token created by Java JWT in python在python中转换由Java JWT创建的JWT令牌
【发布时间】:2017-06-15 12:43:05
【问题描述】:

我收到了一个由 java 程序使用 jjwt 模块创建的 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 行,在解码中 密钥,算法)文件“/Applications/anaconda/envs/modulename/lib/python3.5/site-packages/jwt/api_jws.py”, 第 186 行,在 _verify_signature 中 raise DecodeError('签名验证失败') jwt.exceptions.DecodeError: 签名验证失败

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

【问题讨论】:

    标签: jwt decode jjwt pyjwt


    【解决方案1】:

    这是因为当 Java 创建令牌时,它认为您用作秘密的纯文本是 base64 编码的。我假设 Java 期望字符串秘密是某些二进制文件的 base64 编码版本。在解码 jwt 之前尝试对 secret 进行 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 包没有明确提到我们提供的密钥被假定为 base64 编码的字符串。
    • 很高兴为您提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。请参阅:meta.stackexchange.com/questions/5234/… 了解更多信息
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2015-06-29
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2014-10-12
      • 2019-12-09
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多