auth.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """登录鉴权:进程内存 token(与根目录 backend/app/auth.py 同款)。
  2. 服务重启后 token 失效,需重新登录。单账号,无数据级权限。
  3. """
  4. import secrets
  5. import time
  6. from typing import Optional
  7. from fastapi import Header, HTTPException
  8. from config import AUTH_PASSWORD, AUTH_TOKEN_TTL_SECONDS, AUTH_USER
  9. _tokens: dict[str, float] = {}
  10. def create_token() -> str:
  11. token = secrets.token_hex(32)
  12. _tokens[token] = time.monotonic() + AUTH_TOKEN_TTL_SECONDS
  13. return token
  14. def validate_token(token: Optional[str]) -> bool:
  15. if not token:
  16. return False
  17. expires = _tokens.get(token)
  18. if expires is None:
  19. return False
  20. if time.monotonic() > expires:
  21. _tokens.pop(token, None)
  22. return False
  23. return True
  24. def revoke_token(token: Optional[str]) -> None:
  25. if token:
  26. _tokens.pop(token, None)
  27. def verify_credentials(username: str, password: str) -> bool:
  28. return username == AUTH_USER and password == AUTH_PASSWORD
  29. def require_auth(authorization: str | None = Header(default=None)) -> str:
  30. token = (authorization or "").removeprefix("Bearer ").strip()
  31. if not validate_token(token):
  32. raise HTTPException(status_code=401, detail="未登录或登录已过期")
  33. return token