【发布时间】:2020-08-06 20:46:48
【问题描述】:
我得到了一个不包含任何点的 JWT。我在某处读到 JWT 的典型格式是 3 段字符串连接在一起,总共有 2 个点。当我尝试解码令牌时使用 PyJWT,我收到以下错误 -
Traceback (most recent call last):
File "/home/neelanjana/.virtualenvs/athena_env/lib/python3.7/site-packages/jwt/api_jws.py", line 180, in _load
signing_input, crypto_segment = jwt.rsplit(b'.', 1)
ValueError: not enough values to unpack (expected 2, got 1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/neelanjana/.virtualenvs/athena_env/lib/python3.7/site-packages/jwt/api_jwt.py", line 84, in decode
payload, _, _, _ = self._load(jwt)
File "/home/neelanjana/.virtualenvs/athena_env/lib/python3.7/site-packages/jwt/api_jws.py", line 183, in _load
raise DecodeError('Not enough segments')
jwt.exceptions.DecodeError: Not enough segments
但是,当我在 jwt.io 上放置相同的令牌时,它会被解码,我可以看到完整的字典。我错过了什么?
这是我的代码 -
import jwt
a = "someToken"
print(jwt.decode(a))
将 pastebin 链接附加到令牌 here,因为它太长了,无法放在这里。
附:我不同意使用 pyjwt 的想法。如果任何其他库可以解码它对我来说都是一样的。
【问题讨论】:
-
在 jwt.io 上,底部也显示“无效签名”。你是如何生成令牌的?内容似乎也很大。我不确定我是否会将这么多数据放入 json Web 令牌中。
-
从我在 jwt.io 上看到的情况来看,您可能将实际数据放在了标头的位置,并且有效负载(数据)为空。如果您可以更新代码以显示您如何生成令牌 - 这将很有帮助。
-
我的代币是由第三方提供的,我无法控制它的生成方式,因此无法确认使用了什么算法/秘密等。在 jwt.io 中,虽然它说签名无效,但它仍然能够解码右侧的字典,这就是我希望在我的情况下得到的。
-
我尝试使用 jwt.get_unverified_header(token_string) 并得到相同的响应。只是想知道解码这个令牌是否可行?
-
你可能会查看 PyJWT 的源代码,如果可能的话,只需使用它的函数解密第一部分。