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

结合场景再看三个关注点

  1. 声明 ≠ 已验签——生产必须校验签名算法与密钥。
  2. exp 必需
  3. 撤销常需黑名单/短 TTL/会话存储。

核心概念与准确模型

  • 认证 vs 鉴权
  • Bearer Token
  • 对称 HS* vs 非对称 RS*/ES*
  • refresh token 轮换

边界情况与反直觉行为

  1. alg=none 攻击 历史坑
  2. 时钟偏移
  3. 把 JWT 当加密(默认只签名)

常见误区

[!warning] 常见误区:JWT 自动更安全 错误理解:用了 JWT 就安全。
正确模型:安全取决于密钥、校验、传输与生命周期设计。

工程实践

  • 用 PyJWT 等成熟库
  • HTTPS only
  • 最小声明,敏感数据少放

本节总结

JWT 是工具不是架构终点。先身份模型,再令牌格式。

自测题

  1. 认证与鉴权差别?
  2. 为何需要过期?
参考答案
  1. 你是谁 vs 你能做什么。
  2. 限制泄露窗口;配合轮换/撤销策略。

延伸阅读与资料来源

资料类型支撑内容
RFC 7519 JWT规范JWT
OWASP Auth指南认证实践
创建于 2026/7/15 更新于 2026/7/15