PyJWT返回无效的令牌签名

时间:2016-10-21 15:04:51

标签: python firebase jwt 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

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

  

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21ldGhpbmciOiJIZXJlIn0.fpIMSRJ3AAL30LIDwHJM9ZOumdRzS7yooiiUgMPms2Y

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

pip3 list

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

pip3 uninstall jwt
pip3 uninstall PyJWT
pip3 install PyJWT

重新运行您的应用

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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