"""FastAPI auth dependencies""" from fastapi import Depends, HTTPException, status, Query, Request from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from .jwt_handler import decode_token security = HTTPBearer() async def get_current_user( credentials: HTTPAuthorizationCredentials = Depends(security), ) -> dict: try: payload = decode_token(credentials.credentials) username = payload.get("sub") if username is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) return {"username": username} except Exception: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据") async def get_current_user_ws(token: str = Query(...)) -> dict: """WebSocket auth via query parameter""" try: payload = decode_token(token) username = payload.get("sub") if username is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) return {"username": username} except Exception: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据") async def get_current_user_flexible( request: Request, credentials: HTTPAuthorizationCredentials = Depends(HTTPBearer(auto_error=False)), token: str = Query(None), ) -> dict: """Auth from header OR query param (for file downloads in browser).""" token_str = None if credentials: token_str = credentials.credentials elif token: token_str = token if not token_str: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="未提供认证凭据") try: payload = decode_token(token_str) username = payload.get("sub") if username is None: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) return {"username": username} except Exception: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据")