Python 认证与 JWT
Web 认证把身份建立与鉴权分开;JWT 常作无状态访问令牌,但要处理签名、过期与撤销边界。
#type / concept
#status / growing
#tech / dev
#resource / python
#tech / lang / python
[!info] 关联笔记
Python 认证与 JWT
这个概念为什么出现
API 需要知道“谁在调用”。会话 cookie 与 JWT bearer 是常见路径。JWT 利于无状态扩展,但误用会导致无法撤销、密钥管理混乱。
[!abstract] 一句话理解 认证确认身份,鉴权确认权限;JWT 是被签名的声明集,服务用密钥/公钥校验,并强制过期与受众检查。
最小可运行示例
场景:演示声明字典与过期字段(不引入第三方加密库)
# jwt_claims_demo.py
# 业务意图:展示 JWT 声明层概念(非生产签名实现)。
# 教学点:sub/exp/角色;真实系统用成熟库验签。
from time import time
def build_claims(user_id: str, roles: list[str], ttl_s: int = 3600) -> dict:
now = int(time())
return {"sub": user_id, "roles": roles, "iat": now, "exp": now + ttl_s}
def is_expired(claims: dict, now: int | None = None) -> bool:
current = int(time()) if now is None else now
return current >= int(claims["exp"])
def main() -> None:
claims = build_claims("u1", ["user"])
print("sub:", claims["sub"], "roles:", claims["roles"])
print("expired?", is_expired(claims, now=claims["exp"] + 1))
if __name__ == "__main__":
main()
建议运行:
python jwt_claims_demo.py
期望输出:
sub: u1 roles: ['user']
expired? True
结合场景再看三个关注点
- 声明 ≠ 已验签——生产必须校验签名算法与密钥。
- exp 必需。
- 撤销常需黑名单/短 TTL/会话存储。
核心概念与准确模型
- 认证 vs 鉴权
- Bearer Token
- 对称 HS* vs 非对称 RS*/ES*
- refresh token 轮换
边界情况与反直觉行为
- alg=none 攻击 历史坑
- 时钟偏移
- 把 JWT 当加密(默认只签名)
常见误区
[!warning] 常见误区:JWT 自动更安全 错误理解:用了 JWT 就安全。
正确模型:安全取决于密钥、校验、传输与生命周期设计。
工程实践
- 用 PyJWT 等成熟库
- HTTPS only
- 最小声明,敏感数据少放
本节总结
JWT 是工具不是架构终点。先身份模型,再令牌格式。
自测题
- 认证与鉴权差别?
- 为何需要过期?
参考答案
- 你是谁 vs 你能做什么。
- 限制泄露窗口;配合轮换/撤销策略。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| RFC 7519 JWT | 规范 | JWT |
| OWASP Auth | 指南 | 认证实践 |