diff --git a/backend/app/deps.py b/backend/app/deps.py new file mode 100644 index 0000000..c9b6331 --- /dev/null +++ b/backend/app/deps.py @@ -0,0 +1,31 @@ +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer +from sqlalchemy.orm import Session + +from . import models +from .database import get_db +from .security import decode_access_token + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login") + + +def get_current_user( + token: str = Depends(oauth2_scheme), db: Session = Depends(get_db) +) -> models.User: + """Возвращает активного пользователя по Bearer JWT.""" + credentials_error = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Не удалось подтвердить учётные данные", + headers={"WWW-Authenticate": "Bearer"}, + ) + payload = decode_access_token(token) + if not payload or not payload.get("sub"): + raise credentials_error + try: + user_id = int(payload["sub"]) + except (TypeError, ValueError): + raise credentials_error + user = db.get(models.User, user_id) + if user is None or not user.is_active: + raise credentials_error + return user