9

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

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

4

5 回答 5

10

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

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

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

于 2016-10-21T15:18:40.607 回答
6
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

重新运行您的应用程序

于 2021-02-10T00:53:55.683 回答
2

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

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

payload = jwt.decode("YOUR_JWT_TOKEN","YOUR_SECRET_KEY", algorithms=["HS256"])
于 2021-03-08T11:19:49.960 回答
1

尝试附加.decode("utf-8")到解码功能。

于 2020-04-16T00:10:08.647 回答
0

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

    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

于 2021-10-14T11:09:00.803 回答