PyJWT 使用指南:JWT 编码与解码全解析
【免费下载链接】pyjwt JSON Web Token implementation in Python 项目地址: 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。
最佳实践
- 选择合适的算法:对于高安全性要求,优先选择 RS256、PS256 或 EdDSA
- 保护私钥:私钥必须严格保密,不应存储在代码仓库中
- 设置合理的过期时间:根据业务需求设置适当的过期时间
- 验证所有必要的声明:确保验证 issuer、audience 等关键声明
- 处理异常:捕获并妥善处理各种 JWT 验证异常
通过合理使用 PyJWT 库,开发者可以轻松实现安全的身份验证和授权机制。
【免费下载链接】pyjwt JSON Web Token implementation in Python 项目地址: https://gitcode.com/gh_mirrors/py/pyjwt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



