如何解析 JWT(JSON Web Token)

作者:很酷cat2024.01.17 13:04浏览量:21

简介:了解如何解析 JWT(JSON Web Token),包括 JWT 的组成、解析过程以及如何使用 Python 实现解析。

JWT,全称为 JSON Web Token,是一种开放标准(RFC 7519),用于在各方之间作为 JSON 对象传递信息。这些信息可以被验证和信任,因为它们是数字签名的。JWT 主要用于身份验证和信息交换。
JWT 通常由三部分组成:Header(头部)、Payload(负载)和 Signature(签名)。

  1. Header(头部):描述 JWT 的类型以及所使用的加密算法,如 { "alg": "HS256", "typ": "JWT" }
  2. Payload(负载):包含要传递的数据,这些数据可以是用户信息、角色权限等。通常使用 { "sub": "1234567890", "name": "John Doe", "admin": true } 来表示。
  3. Signature(签名):用于验证 JWT 的完整性和真实性,通过将头部和负载进行 HMAC SHA256 加密生成。
    要解析 JWT,我们需要使用其对应的加密算法解密签名,然后验证解密后的头部和负载是否与原始数据匹配。
    下面是一个使用 Python 解析 JWT 的简单示例:
    1. import base64
    2. import hmac
    3. import hashlib
    4. import json
    5. def base64url_encode(payload):
    6. return base64.urlsafe_b64encode(json.dumps(payload).encode()).decode()
    7. def base64url_decode(encoded_payload):
    8. return json.loads(base64.urlsafe_b64decode(encoded_payload.encode()).decode())
    9. def sign(key, msg):
    10. return hmac.new(key, msg, hashlib.sha256).digest()
    11. def verify_signature(key, encoded_signature, encoded_header, encoded_payload):
    12. signature = base64.urlsafe_b64decode(encoded_signature)
    13. header = base64.urlsafe_b64decode(encoded_header)
    14. header_payload = base64.urlsafe_b64decode(encoded_payload)
    15. return hmac.compare_digest(sign(key, header + '.' + header_payload), signature)
    接下来,你可以使用 signverify_signature 函数来生成和验证 JWT 的签名:
    ```python

    生成 JWT

    key = b’your-secret-key’ # 请使用自己的密钥
    header = {‘alg’: ‘HS256’, ‘typ’: ‘JWT’} # 头部信息
    payload = {‘sub’: ‘1234567890’, ‘name’: ‘John Doe’, ‘admin’: True} # 负载信息
    encoded_header = base64url_encode(header) # 对头部进行编码
    encoded_payload = base64url_encode(payload) # 对负载进行编码
    signature = sign(key, encoded_header + ‘.’ + encoded_payload) # 生成签名
    encoded_signature = base64.urlsafe_b64encode(signature).decode() # 对签名进行编码
    jwt = encoded_header + ‘.’ + encoded_payload + ‘.’ + encoded_signature # 组合成完整的 JWT
    print(‘Generated JWT:’, jwt)

    验证 JWT 签名

    decoded_jwt = encoded_header + ‘.’ + encoded_payload + ‘.’ + encoded_signature # 将 JWT 分割成头部、负载和签名部分
    valid = verify_signature(key, decoded_jwt.split(‘.’)[2], decoded_jwt.split(‘.’)[0], decoded_jwt.split(‘.’)[1]) # 验证签名是否匹配
    print(‘Valid signature:’, valid) # 如果 valid 为 True,则签名有效