【问题标题】:PyJWT returning invalid token signaturesPyJWT 返回无效的令牌签名
【发布时间】:2017-03-03 23:06:22
【问题描述】:

我正在使用 PyJWT==1.4.2 生成我打算用于 Firebase 身份验证的令牌。

很遗憾,我无法使用任何第三方 Python Firebase 库,即使可以,我在尝试使用 FirebaseTokenGenerator 时也遇到了同样的困难。

在我的 API 内部,我有一个为用户名生成令牌的函数。

118     def generate_token(self, username):
119         payload = {
120             'something': 'Here',
121         }   
122         secret = "TESTSECRET"
123         token = jwt.encode(
124             payload,
125             secret,
126             algorithm='HS256')
127         return token

我从这个函数中得到的一个令牌的例子是:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21ldGhpbmciOiJIZXJlIn0.fpIMSRJ3AAL30LIDwHJM9ZOumdRzS7yooiiUgMPms2Y

很遗憾,这不是一个有效的令牌。 https://jwt.io/ 等在线资源告诉我签名部分无效。

不确定这是否是进一步有用的信息,但当我尝试解码令牌时,我得到以下信息:

b'{"alg":"HS256","typ":"JWT"}{"something"[83 chars]\x88'

对我可能做错了什么有什么想法吗?

【问题讨论】:

    标签: python firebase jwt firebase-authentication pyjwt


    【解决方案1】:

    这确实是一个有效的令牌,如果您转到jwt.io 并粘贴该令牌然后更新用于验证它的秘密 与您生成令牌时使用的相同,那么该工具将表明签名有效。

    默认情况下,jwt.io 尝试使用 HS256 算法和默认密码 secret 验证签名。您确实是在使用 HS256 算法创建 JWT,因此您唯一需要做的就是检查它是否有效,即更新密码输入框以使用 TESTSECRET

    此外,JWT 的签名组件是原始二进制数据,如果您尝试将其解码为文本,可能无法正确显示。有关 JWT 工作原理的更多信息,请查看Get Started with JSON Web Tokens

    【讨论】:

    • 敲击键盘 我并没有把我的秘密改回来。这确实是问题所在。进一步的问题,我不知道解码 JWT 不一定能正确显示。当我尝试使用 decoded = base64.b64decode(token) 执行此操作时,我收到“不正确的填充”错误或我的有效负载的截止版本。该资源非常有用,谢谢!
    • 在软件开发中,吸引我们的总是小细节......欢迎加入俱乐部。 :)
    【解决方案2】:
    example_payload = {
        'public_id': user.public_id,
        'exp': datetime.datetime.utcnow()+datetime.timedelta(minutes=30)
    }
    

    对于编码使用

    token = jwt.encode(example_payload,app.config['SECRET_KEY'],algorithm="HS256")
    

    解码使用

    data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
    

    基本上只是添加 ALGORITHM 和 ALGORITHM=[] 部分...否则它给了我错误(登录后令牌对操作无效),但这修复了它。

    在 Python3 中,您不需要“jwt.encode()”之后的“.decode('UTF-8')”:它会为您完成。

    还要检查您是否同时拥有 jwt 和 PyJWT 包:

    pip3 list
    

    如果您同时安装了 jwt 和 PyJWT,请执行以下操作:

    pip3 uninstall jwt
    pip3 uninstall PyJWT
    pip3 install PyJWT
    

    重新运行您的应用

    【讨论】:

      【解决方案3】:

      尝试将.decode("utf-8") 附加到解码函数。

      【讨论】:

        【解决方案4】:

        我猜用最新版本的 PyJWT 解码时你需要使用算法。

        我也面临同样的问题。使用算法参数解决它。我使用的 PyJwt 版本是 2.0.1。下面是示例代码。请尝试让我知道它是否有效。

        payload = jwt.decode("YOUR_JWT_TOKEN","YOUR_SECRET_KEY", algorithms=["HS256"])
        

        【讨论】:

          【解决方案5】:

          无论如何,有人像我一样使用它并用这种方法创建令牌

              from flask_jwt_extended import create_access_token
          
              access_token = create_access_token(identity=access_token)
          

          你应该在你的 app.py 中添加

          app.config['algorithms'] = ["HS256"]
          

          我正在使用 PyJWT 2.1.0

          【讨论】:

            猜你喜欢
            • 2018-09-24
            • 2014-05-31
            • 2021-06-21
            • 1970-01-01
            • 1970-01-01
            • 2017-05-30
            • 2017-10-15
            • 2018-07-22
            • 2017-10-16
            相关资源
            最近更新 更多