2d-game-backend / routes /auth_routes.py
Student Hub
Initial backend for Hugging Face Spaces
2f4298a
from datetime import timedelta
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from database import get_db
from schemas import UserCreate, UserResponse, Token
from auth import (
authenticate_user,
create_access_token,
create_user,
get_current_active_user
)
from config import get_settings
from models import User
settings = get_settings()
router = APIRouter(prefix="/api/auth", tags=["Authentication"])
@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
async def register(user_data: UserCreate, db: Session = Depends(get_db)):
"""Регистрация нового пользователя"""
user = create_user(
db=db,
username=user_data.username,
email=user_data.email,
password=user_data.password
)
return user
@router.post("/login", response_model=Token)
async def login(
form_data: OAuth2PasswordRequestForm = Depends(),
db: Session = Depends(get_db)
):
"""Вход в систему"""
user = authenticate_user(db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
# Обновление времени последнего входа
from datetime import datetime
user.last_login = datetime.utcnow()
db.commit()
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
@router.get("/me", response_model=UserResponse)
async def read_users_me(current_user: User = Depends(get_current_active_user)):
"""Получение информации о текущем пользователе"""
return current_user
@router.post("/logout")
async def logout(current_user: User = Depends(get_current_active_user)):
"""Выход из системы"""
return {"message": "Successfully logged out"}