PyJWT 返回无效的令牌签名

Rob*_*ley 8 python jwt firebase firebase-authentication pyjwt

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21ldGhpbmciOiJIZXJlIn0.fpIMSRJ3AAL30LIDwHJM9ZOumdRzS7yooiiUgMPms2Y

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

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

b'{"alg":"HS256","typ":"JWT"}{"something"[83 chars]\x88'
Run Code Online (Sandbox Code Playgroud)

关于我可能做错了什么的任何想法?

Joã*_*elo 10

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

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

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


小智 7

example_payload = {
    'public_id': user.public_id,
    'exp': datetime.datetime.utcnow()+datetime.timedelta(minutes=30)
}
Run Code Online (Sandbox Code Playgroud)

用于编码用途

token = jwt.encode(example_payload,app.config['SECRET_KEY'],algorithm="HS256")
Run Code Online (Sandbox Code Playgroud)

用于解码使用

data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
Run Code Online (Sandbox Code Playgroud)

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

在Python3中,你不需要“jwt.encode()”之后的“.decode('UTF-8')”:它会为你做这件事。

另请检查您是否同时拥有 jwt 和 PyJWT 软件包:

pip3 list
Run Code Online (Sandbox Code Playgroud)

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

pip3 uninstall jwt
pip3 uninstall PyJWT
pip3 install PyJWT
Run Code Online (Sandbox Code Playgroud)

重新运行您的应用程序