demo_jwt.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """
  2. ============================================================
  3. 最小可运行 demo —— 单独搞懂 JWT(那张带防伪章的小纸条)
  4. (不需要数据库、不需要起服务器,就是个普通脚本)
  5. 运行方法:
  6. 1. 安装依赖: pip install "python-jose[cryptography]"
  7. 2. 直接运行: python demo_jwt.py
  8. ============================================================
  9. """
  10. from jose import jwt, JWTError
  11. SECRET = "only-server-knows-this-secret" # 密钥:只有服务器知道,真实项目放在配置/环境变量里
  12. ALGO = "HS256" # 加密算法
  13. # ===== 第1步:登录成功时,把用户信息装进纸条,盖上防伪章 =====
  14. payload = {
  15. "sub": "user-123", # 用户ID
  16. "role": "bidder", # 角色
  17. "tenant_id": "school-1", # 机构
  18. }
  19. token = jwt.encode(payload, SECRET, algorithm=ALGO)
  20. print("【生成的 token】")
  21. print(token)
  22. print()
  23. # 这串 token 其实就是【三段用点号连接】:头部 . 载荷 . 签名
  24. print("【它由三段组成】")
  25. for i, part in enumerate(token.split("."), 1):
  26. print(f" 第{i}段:{part}")
  27. print()
  28. # ===== 第2步:之后每次收到请求,验章 + 取出里面的内容 =====
  29. decoded = jwt.decode(token, SECRET, algorithms=[ALGO])
  30. print("【验章通过,取回内容】")
  31. print(" ", decoded)
  32. print(" 用户ID =", decoded.get("sub"), " 角色 =", decoded.get("role"))
  33. print()
  34. # 👆 get_current_user 干的就是这一步:decode 出来,再取 sub/role/tenant_id。
  35. # ===== 第3步:如果有人伪造或篡改 token,会怎样? =====
  36. fake_token = token[:-3] + "xxx" # 偷偷把签名最后3个字符改掉
  37. print("【有人篡改了 token,尝试验证...】")
  38. try:
  39. jwt.decode(fake_token, SECRET, algorithms=[ALGO])
  40. except JWTError as e:
  41. print(" 验证失败!服务器一眼识破伪造:", e)
  42. print(" → 这时 get_current_user 就会返回 401(未授权)")