【问题标题】:python decode JWT not containing any dotspython解码不包含任何点的JWT
【发布时间】: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 的源代码,如果可能的话,只需使用它的函数解密第一部分。

标签: python jwt pyjwt


【解决方案1】:

回答我自己的问题,上面的字符串不是 JWT 而是 base64 编码的字符串。使用base64解码恢复了实际的dict。

【讨论】:

  • 这就是我在 4 月 23 日的评论中告诉你的。但我认为你可以删除这个问题,恕我直言,将来不太可能对任何人有用。
  • 同意,将在某个时候删除。谢谢:)
猜你喜欢
  • 2016-03-19
  • 2021-11-01
  • 1970-01-01
  • 2016-04-25
  • 2017-11-11
  • 2021-02-14
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多