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