Files
New-planet-api/new-planet-backend/app/api/v1/auth.py
2025-12-13 14:39:50 +03:00

64 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from fastapi import APIRouter, Depends, HTTPException, status, Body
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.ext.asyncio import AsyncSession
from app.db.session import get_db
from app.schemas.user import UserCreate, User
from app.schemas.token import Token
from app.services.auth_service import auth_service
from app.api.deps import get_current_active_user
router = APIRouter()
@router.post("/register", response_model=User, status_code=status.HTTP_201_CREATED)
async def register(
user_in: UserCreate,
db: AsyncSession = Depends(get_db)
):
"""Регистрация нового пользователя"""
try:
user = await auth_service.register(db, user_in)
return user
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e)
)
@router.post("/login", response_model=Token)
async def login(
form_data: OAuth2PasswordRequestForm = Depends(),
db: AsyncSession = Depends(get_db)
):
"""Аутентификация пользователя"""
token = await auth_service.authenticate(db, form_data.username, form_data.password)
if not token:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect email or password",
headers={"WWW-Authenticate": "Bearer"},
)
return token
@router.post("/refresh", response_model=Token)
async def refresh_token(
refresh_token: str = Body(..., embed=True)
):
"""Обновление access token"""
new_access_token = auth_service.refresh_access_token(refresh_token)
if not new_access_token:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid refresh token"
)
return Token(access_token=new_access_token, token_type="bearer")
@router.get("/me", response_model=User)
async def read_users_me(current_user: User = Depends(get_current_active_user)):
"""Получить информацию о текущем пользователе"""
return current_user