Python - 如何解码 JWT 标头?

tim*_*son 3 python jwt

我有一个包含以下 header 的令牌eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ

如何获得jwt.io提供的以下 JSON 解码?

{
  "kid": "86D88Kf",
  "alg": "RS256"
}
Run Code Online (Sandbox Code Playgroud)

jwt.decode()没有给出这个标题。

谢谢!

jps*_*jps 13

在 PyJwt 中用于get_unverified_header(token)此目的。kid这对于在验证令牌之前获取密钥 id () 特别有用。因此,在最后一行中,我展示了如何kid从标头中提取 。

import jwt
token = "eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
header = jwt.get_unverified_header(token)
print (header)
print (header['kid'])
Run Code Online (Sandbox Code Playgroud)

结果:

{'孩子':'86D88Kf','alg':'RS256'}
86D88Kf

文档中所述


tde*_*ney 12

这是一个未加密的标头。它是您想要的数据的 JSON 编码的 URL 安全 base64 编码。您需要在编码字符串的末尾添加填充字符,以确保其位于 4 个字符的边界上,然后进行解码。

>>> import json
>>> import base64
>>> token = "eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ"
>>> padded = token + "="*divmod(len(token),4)[1]
>>> padded
'eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ=='
>>> jsondata = base64.urlsafe_b64decode(padded)
>>> jsondata
b'{"kid":"86D88Kf","alg":"RS256"}'
>>> data = json.loads(jsondata)
>>> data
{'kid': '86D88Kf', 'alg': 'RS256'}
Run Code Online (Sandbox Code Playgroud)