45 lines
1.9 KiB
Python
45 lines
1.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from fastapi.security import OAuth2PasswordRequestForm
|
|
from datetime import timedelta
|
|
|
|
# Importations ABSOLUES
|
|
from core.database import get_db
|
|
from core.security import verify_password, create_access_token
|
|
from crud import user as crud_user # Était déjà correcte pour "crud", mais assure la cohérence
|
|
from schemas import user as schemas_user
|
|
from core.config import settings
|
|
from core.hashing import verify_password
|
|
|
|
router = APIRouter(
|
|
prefix="/auth",
|
|
tags=["Authentication"],
|
|
responses={404: {"description": "Not found"}},
|
|
)
|
|
|
|
ACCESS_TOKEN_EXPIRE_MINUTES = settings.ACCESS_TOKEN_EXPIRE_MINUTES
|
|
|
|
@router.post("/register", response_model=schemas_user.UserResponse, status_code=status.HTTP_201_CREATED)
|
|
def register_user(user: schemas_user.UserCreate, db: Session = Depends(get_db)):
|
|
db_user = crud_user.get_user_by_email(db, email=user.email)
|
|
if db_user:
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Email déjà enregistré.")
|
|
|
|
new_user = crud_user.create_user(db=db, user=user)
|
|
return new_user
|
|
|
|
@router.post("/login", response_model=dict)
|
|
def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
|
|
user = crud_user.get_user_by_email(db, email=form_data.username)
|
|
if not user or not verify_password(form_data.password, user.hashed_password):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Identifiants incorrects",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
|
|
access_token = create_access_token(
|
|
data={"sub": user.email}, expires_delta=access_token_expires
|
|
)
|
|
return {"access_token": access_token, "token_type": "bearer"}
|