【免费下载】 PyJWT 使用指南:JWT 编码与解码全解析

PyJWT 使用指南:JWT 编码与解码全解析

【免费下载链接】pyjwt JSON Web Token implementation in Python 【免费下载链接】pyjwt 项目地址: https://gitcode.com/gh_mirrors/py/pyjwt

什么是 JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递声明。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),三者通过点号连接形成一个完整的令牌。

基础用法

HS256 算法编码与解码

HS256(HMAC SHA-256)是一种对称加密算法,使用同一个密钥进行编码和解码。

import jwt

# 设置密钥
secret_key = "my_super_secret_key"

# 编码JWT
payload = {"user_id": 12345, "username": "john_doe"}
encoded_token = jwt.encode(payload, secret_key, algorithm="HS256")

# 解码JWT
decoded_payload = jwt.decode(encoded_token, secret_key, algorithms=["HS256"])
print(decoded_payload)

非对称加密算法

RS256 算法(RSA)

RS256 是一种非对称加密算法,使用私钥签名,公钥验证。这种方式更安全,因为私钥不需要共享。

import jwt

# RSA 私钥和公钥
private_key = """-----BEGIN RSA PRIVATE KEY-----
... 私钥内容 ...
-----END RSA PRIVATE KEY-----"""

public_key = """-----BEGIN PUBLIC KEY-----
... 公钥内容 ...
-----END PUBLIC KEY-----"""

# 编码JWT
payload = {"user_id": 12345}
encoded_token = jwt.encode(payload, private_key, algorithm="RS256")

# 解码JWT
decoded_payload = jwt.decode(encoded_token, public_key, algorithms=["RS256"])

注意:使用 RSA 算法需要安装 cryptography 模块。

带密码的私钥处理

如果私钥有密码保护,需要先使用 cryptography 模块加载私钥:

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

# 加载带密码的私钥
private_key = serialization.load_pem_private_key(
    pem_bytes,  # PEM格式的私钥字节
    password=b"your_password",  # 私钥密码
    backend=default_backend()
)

# 使用加载后的私钥编码JWT
encoded_token = jwt.encode(payload, private_key, algorithm="RS256")

PS256 算法(RSA-PSS)

PS256 是 RSA 的另一种签名方案,提供更强的安全性:

encoded_token = jwt.encode(payload, private_key, algorithm="PS256")
decoded_payload = jwt.decode(encoded_token, public_key, algorithms=["PS256"])

EdDSA 算法(Ed25519)

EdDSA 是一种现代的椭圆曲线签名算法:

encoded_token = jwt.encode(payload, private_key, algorithm="EdDSA")
decoded_payload = jwt.decode(encoded_token, public_key, algorithms=["EdDSA"])

ES256 算法(ECDSA)

ECDSA 是另一种椭圆曲线签名算法:

encoded_token = jwt.encode(payload, private_key, algorithm="ES256")
decoded_payload = jwt.decode(encoded_token, public_key, algorithms=["ES256"])

高级功能

自定义头部信息

可以在编码时添加自定义头部信息:

headers = {
    "kid": "unique_key_identifier",
    "typ": "JWT"
}

encoded_token = jwt.encode(
    payload,
    secret_key,
    algorithm="HS256",
    headers=headers
)

不验证签名读取声明

在某些调试场景下,可能需要读取JWT内容而不验证签名:

decoded_payload = jwt.decode(encoded_token, options={"verify_signature": False})

警告:生产环境中不应使用此功能,因为它无法保证数据的真实性和完整性。

读取未验证的头部

headers = jwt.get_unverified_header(encoded_token)

JWT 标准声明

JWT 规范定义了一些标准声明(Claims),PyJWT 支持以下标准声明:

过期时间(exp)

设置令牌过期时间:

from datetime import datetime, timedelta, timezone

# 设置1小时后过期
payload = {
    "user_id": 12345,
    "exp": datetime.now(tz=timezone.utc) + timedelta(hours=1)
}

encoded_token = jwt.encode(payload, secret_key, algorithm="HS256")

解码时会自动验证过期时间,如果过期会抛出 jwt.ExpiredSignatureError

时间容差(leeway)

考虑到时钟不同步,可以设置时间容差:

# 令牌已过期,但允许5秒的容差
decoded_payload = jwt.decode(
    encoded_token, 
    secret_key, 
    leeway=5, 
    algorithms=["HS256"]
)

生效时间(nbf)

设置令牌生效时间:

payload = {
    "user_id": 12345,
    "nbf": datetime.now(tz=timezone.utc) + timedelta(minutes=5)  # 5分钟后生效
}

签发者(iss)

验证令牌签发者:

payload = {"iss": "my_app"}
encoded_token = jwt.encode(payload, secret_key, algorithm="HS256")

# 验证签发者
decoded_payload = jwt.decode(
    encoded_token, 
    secret_key, 
    issuer="my_app", 
    algorithms=["HS256"]
)

如果签发者不匹配,会抛出 jwt.InvalidIssuerError

受众(aud)

验证令牌目标受众:

payload = {"aud": ["app1", "app2"]}
encoded_token = jwt.encode(payload, secret_key, algorithm="HS256")

# 验证受众
decoded_payload = jwt.decode(
    encoded_token, 
    secret_key, 
    audience="app1", 
    algorithms=["HS256"]
)

如果受众不匹配,会抛出 jwt.InvalidAudienceError

最佳实践

  1. 选择合适的算法:对于高安全性要求,优先选择 RS256、PS256 或 EdDSA
  2. 保护私钥:私钥必须严格保密,不应存储在代码仓库中
  3. 设置合理的过期时间:根据业务需求设置适当的过期时间
  4. 验证所有必要的声明:确保验证 issuer、audience 等关键声明
  5. 处理异常:捕获并妥善处理各种 JWT 验证异常

通过合理使用 PyJWT 库,开发者可以轻松实现安全的身份验证和授权机制。

【免费下载链接】pyjwt JSON Web Token implementation in Python 【免费下载链接】pyjwt 项目地址: https://gitcode.com/gh_mirrors/py/pyjwt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值