43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from fastapi.security import OAuth2PasswordRequestForm
|
|
from sqlmodel import select
|
|
|
|
from app.deps import SessionDep
|
|
from app.models import User
|
|
from app.schemas import Token, UserCreate, UserRead
|
|
from app.security import create_access_token, get_password_hash, verify_password
|
|
|
|
router = APIRouter(prefix="/api/auth", tags=["auth"])
|
|
|
|
|
|
@router.post("/register", response_model=UserRead, status_code=status.HTTP_201_CREATED)
|
|
def register(user_in: UserCreate, session: SessionDep):
|
|
existing_user = session.exec(select(User).where(User.username == user_in.username)).first()
|
|
if existing_user:
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Username already registered")
|
|
|
|
user = User(username=user_in.username, hashed_password=get_password_hash(user_in.password))
|
|
session.add(user)
|
|
session.commit()
|
|
session.refresh(user)
|
|
return user
|
|
|
|
|
|
@router.post("/token", response_model=Token)
|
|
def login(
|
|
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
|
|
session: SessionDep,
|
|
):
|
|
user = session.exec(select(User).where(User.username == form_data.username)).first()
|
|
if not user or not verify_password(form_data.password, user.hashed_password):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Incorrect username or password",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
access_token = create_access_token(data={"sub": user.username})
|
|
return Token(access_token=access_token)
|