token.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """
  2. 本地 Token 验证工具
  3. 用于区分本地生成的 token 和外部系统的 token
  4. """
  5. import jwt
  6. from typing import Optional
  7. from utils.logger import logger
  8. def verify_local_token(token: str) -> Optional[dict]:
  9. """
  10. 验证是否为本地生成的 token
  11. Args:
  12. token: JWT token 字符串
  13. Returns:
  14. 如果是本地 token 返回解码后的数据,否则返回 None
  15. """
  16. if not token:
  17. return None
  18. try:
  19. # 尝试解码 token(不验证签名,只检查格式)
  20. # 本地 token 应该包含特定的字段,如 account, username 等
  21. decoded = jwt.decode(token, options={"verify_signature": False})
  22. # 检查是否包含本地 token 的特征字段
  23. # 根据实际的 token 结构调整
  24. if "account" in decoded or "username" in decoded:
  25. logger.info(f"[Token验证] 识别为本地 token: {decoded.get('username', 'unknown')}")
  26. return decoded
  27. logger.info("[Token验证] 不是本地 token 格式")
  28. return None
  29. except jwt.DecodeError:
  30. logger.info("[Token验证] Token 解码失败,不是有效的 JWT")
  31. return None
  32. except Exception as e:
  33. logger.warning(f"[Token验证] Token 验证异常: {e}")
  34. return None
  35. def is_local_token(token: str) -> bool:
  36. """
  37. 判断是否为本地 token
  38. Args:
  39. token: JWT token 字符串
  40. Returns:
  41. True 表示本地 token,False 表示外部 token
  42. """
  43. return verify_local_token(token) is not None