ID 令牌(又名 JSON Web 签名 (JWS))有 3 个由.
字符分隔的部分:
Header.Payload.Signature
我们可以通过拆分token来获取各个部分:
parts = token.split(".")
现在我不知道原因,但是这些部分没有base64填充。也许是因为它没有被强制执行(见这个)?而 python base64 库需要它。
填充字符为=
,并且填充应添加到 base64 字符串,使其长度为 4 个字符的倍数。例如,如果字符串是 14 个字符,则它应该==
在末尾有填充,以便总共有 16 个字符。
所以计算正确填充的公式是这样的:
4 - len(base64_string) % 4
在我们添加正确的填充并解码字符串之后:
payload = parts[1]
padded = payload + '=' * (4 - len(payload) % 4)
base64.b64decode(填充)
我们将得到一个 JSON 对象的字符串表示形式,我们可以将其转换为 JSON:
json.loads(base64.b64decode(padded))
最后我们可以把所有东西都放在一个方便的函数中:
import base64
import json
def parse_id_token(token: str) -> dict:
parts = token.split(".")
if len(parts) != 3:
raise Exception("Incorrect id token format")
payload = parts[1]
padded = payload + '=' * (4 - len(payload) % 4)
decoded = base64.b64decode(padded)
return json.loads(decoded)
想了解更多关于 id token 的详情,请查看 Takahiko Kawasaki(authlete.com 创始人)的优秀文章