| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- """登录鉴权:进程内存 token(与根目录 backend/app/auth.py 同款)。
- 服务重启后 token 失效,需重新登录。单账号,无数据级权限。
- """
- import secrets
- import time
- from typing import Optional
- from fastapi import Header, HTTPException
- from config import AUTH_PASSWORD, AUTH_TOKEN_TTL_SECONDS, AUTH_USER
- _tokens: dict[str, float] = {}
- def create_token() -> str:
- token = secrets.token_hex(32)
- _tokens[token] = time.monotonic() + AUTH_TOKEN_TTL_SECONDS
- return token
- def validate_token(token: Optional[str]) -> bool:
- if not token:
- return False
- expires = _tokens.get(token)
- if expires is None:
- return False
- if time.monotonic() > expires:
- _tokens.pop(token, None)
- return False
- return True
- def revoke_token(token: Optional[str]) -> None:
- if token:
- _tokens.pop(token, None)
- def verify_credentials(username: str, password: str) -> bool:
- return username == AUTH_USER and password == AUTH_PASSWORD
- def require_auth(authorization: str | None = Header(default=None)) -> str:
- token = (authorization or "").removeprefix("Bearer ").strip()
- if not validate_token(token):
- raise HTTPException(status_code=401, detail="未登录或登录已过期")
- return token
|