PyJWT 返回无效的令牌签名

PyJWT returning invalid token signatures

我正在使用 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'

对我可能做错的事情有什么想法吗?

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

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

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

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

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 和 ALGORITHMS=[] 部分...否则它会给我错误(登录后令牌对操作无效),但这修复了它。

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

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

pip3 list

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

pip3 uninstall jwt
pip3 uninstall PyJWT
pip3 install PyJWT

重新运行您的应用程序

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

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

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

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

    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