""" Зависимости для аутентификации Автор: Сергей Антропов Сайт: https://devops.org.ru """ from typing import Optional from fastapi import Depends, HTTPException, status, Request from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from app.auth.security import decode_access_token security = HTTPBearer(auto_error=False) async def get_current_user( request: Request, credentials: Optional[HTTPAuthorizationCredentials] = Depends(security) ): """Получение текущего пользователя из токена (cookie или Authorization header)""" token = None # Сначала проверяем, есть ли пользователь в request.state (установлен middleware) if hasattr(request.state, 'user') and request.state.user: return {"username": request.state.user} # Проверяем cookie if request.cookies and "access_token" in request.cookies: token = request.cookies.get("access_token") # Проверяем заголовок Authorization elif credentials: token = credentials.credentials if not token: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Требуется аутентификация" ) payload = decode_access_token(token) if payload is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Неверный токен аутентификации" ) username: str = payload.get("sub") if username is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Неверный токен аутентификации" ) return {"username": username} # Для простоты пока без реальной БД пользователей # В будущем можно добавить модель User async def get_current_user_optional( request: Request, credentials: Optional[HTTPAuthorizationCredentials] = Depends(security) ): """Опциональное получение пользователя (для публичных страниц)""" try: # Сначала проверяем, есть ли пользователь в request.state (установлен middleware) if hasattr(request.state, 'user') and request.state.user: return {"username": request.state.user} # Проверяем cookie token = None if request.cookies and "access_token" in request.cookies: token = request.cookies.get("access_token") # Проверяем заголовок Authorization elif credentials: token = credentials.credentials if token: payload = decode_access_token(token) if payload: username: str = payload.get("sub") if username: return {"username": username} except: pass return None