在分布式架构中实现授权和身份验证层,通常使用集中管理身份的系统,如 OAuth 2.0、OpenID Connect 或企业身份提供者 (IdP)。身份验证(确认身份)通过外部提供者进行,之后结果(通常是令牌)用于在所有服务中进行授权(授予权限)。
通常,流程如下:
以下是 Python 通过 PyJWT 库验证 JWT 令牌的代码示例:
import jwt from jwt.exceptions import InvalidTokenError def verify_jwt(token, public_key): try: payload = jwt.decode(token, public_key, algorithms=["RS256"]) return payload except InvalidTokenError: return None # 使用示例 user_info = verify_jwt(received_token, public_key) if user_info: # 访问被允许 pass else: # 访问被拒绝 pass
关键特性:
问题: 是否必须将用户权限的所有信息直接存储在 JWT 令牌中?
不必。为最小化令牌大小,通常只放用户 ID 和最小权限/角色集。详细权限可以通过额外请求或加载的配置声明按需从服务器获取。
问题: 刷新令牌是否是所有分布式架构的必备元素?
不,只有在需要长期会话而无需重新身份验证时才需要刷新令牌。在无状态 API 中,往往仅使用短期的访问令牌,而刷新逻辑则仅在 Web 或移动客户端中实现。
问题: JWT 中的有效负载部分可以加密吗?
根据 JWT 标准 (RFC 7519),有效负载仅被签名,而不被加密。加密使用另一种标准 — JWE(JSON Web Encryption)。否则,任何拥有令牌的人都可以读取有效负载(例如,通过 jwt.io):
import jwt jwt.decode(token, options={"verify_signature": False})