【Python】Python-JOSE:Python 中的 JSON Web Token 处理库
Python-JOSE 是一个用于处理 JSON Web Token (JWT) 和 JOSE (JSON Object Signing and Encryption) 标准的 Python 库。它支持对 JWT 进行签名、加密、解密和验证等操作,是处理基于 OAuth 2.0 和 OpenID Connect 协议的身份验证和授权任务的理想选择。Python-JOSE 实现了 JOSE 规范中定义的 JWS (JSON Web Signature)、JWE (JSON Web Encryption)、JWK (JSON Web Key) 和 JWA (JSON Web Algorithms),为开发者提供了全面的 JWT 处理支持。
在本篇博客中,我们将详细介绍 Python-JOSE 的功能,演示如何使用它处理 JWT 以及一些常见的使用场景。
➰缘起
- 💯 什么是 JSON Web Token (JWT)?
- 💯 Python-JOSE 的安装
- 💯 使用 Python-JOSE 生成和验证 JWT
- 生成 JWT
- 验证 JWT
- 使用非对称密钥签名和验证 JWT
- 生成 RSA JWT
- 验证 RSA JWT
- 💯 Python-JOSE 支持的算法
- 💯 JWT 使用场景
- 身份验证
- API 认证
- OAuth 2.0 和 OpenID Connect
- 📥 下载地址
- 💬 结语
- 📒 参考文献
💯 什么是 JSON Web Token (JWT)?
JWT 是一种基于 JSON 的开放标准(RFC 7519),它定义了一种紧凑的、可用于不同场景的令牌格式。JWT 通常用于在身份验证和授权系统中,安全地传递信息。一个 JWT 由三个部分组成:头部(Header)、有效载荷(Payload) 和 签名(Signature)。这三个部分通过点 (.
) 分隔。典型的 JWT 结构如下:
header.payload.signature
JWT 的使用场景包括:
- 身份验证:使用 JWT 在用户登录后生成一个令牌,该令牌在后续请求中用于验证用户身份。
- 授权:通过 JWT 携带用户权限信息,来控制资源的访问。
- 安全传输信息:JWT 可以对数据进行签名或加密,以确保数据的完整性和保密性。
💯 Python-JOSE 的安装
安装 Python-JOSE 非常简单,可以使用 pip
命令进行安装:
pip install python-jose
安装后,你就可以导入 jose
模块并开始使用库的功能。
💯 使用 Python-JOSE 生成和验证 JWT
生成 JWT
使用 Python-JOSE 生成 JWT 非常简单,以下示例展示了如何使用对称密钥(HMAC)生成一个 JWT:
from jose import jwt
# 定义密钥
secret_key = 'my_secret_key'
# 定义 JWT 的有效载荷
payload = {
"sub": "1234567890",
"name": "John Doe",
"admin": True
}
# 使用 HS256 算法生成 JWT
token = jwt.encode(payload, secret_key, algorithm='HS256')
print(f"Generated JWT: {token}")
在这个例子中,我们定义了一个简单的有效载荷,包括用户的 ID 和角色信息,并使用 HS256
算法进行签名生成 JWT。生成的 JWT 可以用于后续的身份验证请求。
验证 JWT
生成的 JWT 可以通过 Python-JOSE 进行验证,以下是验证 JWT 的示例:
from jose import jwt
# 定义密钥
secret_key = 'my_secret_key'
# 已生成的 JWT
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.-5q9_BqJsxC_HsszqPIzGcXjG7knIczjfNYoHvCRklM'
# 验证 JWT 并解码有效载荷
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=['HS256'])
print(f"Decoded Payload: {decoded_payload}")
except jwt.JWTError as e:
print(f"Invalid token: {e}")
在这个例子中,我们使用 jwt.decode
方法验证 JWT,并解码有效载荷。如果签名无效或令牌已被篡改,验证将失败并抛出 JWTError
异常。
使用非对称密钥签名和验证 JWT
除了对称密钥签名,Python-JOSE 还支持使用非对称密钥(如 RSA)进行签名和验证。以下是使用 RSA 密钥生成和验证 JWT 的示例:
生成 RSA JWT
from jose import jwt
from cryptography.hazmat.primitives import serialization
# 读取 RSA 私钥
with open('rsa_private_key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
)
# 定义有效载荷
payload = {
"sub": "1234567890",
"name": "Jane Doe",
"admin": False
}
# 使用 RSA256 算法生成 JWT
token = jwt.encode(payload, private_key, algorithm='RS256')
print(f"Generated JWT with RSA: {token}")
验证 RSA JWT
from jose import jwt
from cryptography.hazmat.primitives import serialization
# 读取 RSA 公钥
with open('rsa_public_key.pem', 'rb') as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
)
# 验证 JWT 并解码
try:
decoded_payload = jwt.decode(token, public_key, algorithms=['RS256'])
print(f"Decoded Payload: {decoded_payload}")
except jwt.JWTError as e:
print(f"Invalid token: {e}")
这个示例展示了如何使用 RSA 私钥签名生成 JWT,并使用 RSA 公钥验证和解码令牌。
💯 Python-JOSE 支持的算法
Python-JOSE 支持多种加密和签名算法,包括对称和非对称算法。以下是支持的主要算法列表:
算法类型 | 算法名称 | 说明 |
---|---|---|
对称签名算法 | HS256, HS384, HS512 | HMAC 使用 SHA-256/384/512 算法进行签名 |
非对称签名算法 | RS256, RS384, RS512 | RSA 使用 SHA-256/384/512 算法进行签名 |
非对称签名算法 | ES256, ES384, ES512 | ECDSA 使用 SHA-256/384/512 算法进行签名 |
非对称签名算法 | PS256, PS384, PS512 | RSA-PSS 使用 SHA-256/384/512 算法进行签名 |
加密算法 | A128KW, A256KW | AES 密钥包装算法 |
加密算法 | A128GCMKW, A256GCMKW | AES GCM 密钥包装算法 |
加密算法 | A128CBC-HS256, A256CBC-HS512 | AES CBC 加密算法与 HMAC 结合 |
通过这些算法,开发者可以灵活选择合适的加密和签名方式来保护 JWT 的安全。
💯 JWT 使用场景
JWT 广泛应用于各种身份验证和授权场景中,以下是一些常见的使用场景:
身份验证
在用户成功登录后,服务器可以生成一个 JWT 并将其返回给客户端。客户端将该 JWT 存储在本地(如浏览器的 localStorage
),并在每次请求时将其发送给服务器。服务器通过验证 JWT 来确认用户的身份。
API 认证
在构建 RESTful API 时,JWT 常用于认证 API 请求。客户端在每次调用 API 时将 JWT 添加到请求头中,服务器通过验证 JWT 来确认请求的合法性。
OAuth 2.0 和 OpenID Connect
JWT 是 OAuth 2.0 和 OpenID Connect 协议中的标准令牌格式,用于传递身份验证信息。JWT 可以携带用户的身份和权限信息,授权客户端访问受保护的资源。
📥 下载地址
Python-JOSE 最新版 下载地址
💬 结语
Python-JOSE 是一个功能强大的库,专门用于处理 JWT 和 JOSE 标准的各种操作。它支持多种加密和签名算法,能够满足不同应用场景下的安全需求。通过 Python-JOSE,开发者可以轻松生成、验证和管理 JWT,从而实现安全、可靠的身份验证和授权机制。
无论是为 Web 应用实现单点登录,还是构建安全的 RESTful API,Python-JOSE 都为开发者提供了简洁易用的工具。如果你需要在 Python 项目中处理 JWT,不妨尝试使用 Python-JOSE。
📒 参考文献
- Python-JOSE GitHub仓库