78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
"""
|
|
Authentication API routes.
|
|
Handles user registration, login, and logout.
|
|
"""
|
|
from fastapi import APIRouter, Depends, HTTPException, status, Response
|
|
from motor.motor_asyncio import AsyncIOMotorDatabase
|
|
|
|
from app.core.deps import get_db, get_current_user, require_auth
|
|
from app.models.user import UserCreate, UserLogin, UserResponse
|
|
from app.services.auth import create_user, authenticate_user, create_access_token
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
|
|
async def register(
|
|
user_data: UserCreate,
|
|
db: AsyncIOMotorDatabase = Depends(get_db)
|
|
):
|
|
"""Register a new user account"""
|
|
user = await create_user(db, user_data)
|
|
return user
|
|
|
|
|
|
@router.post("/login")
|
|
async def login(
|
|
credentials: UserLogin,
|
|
response: Response,
|
|
db: AsyncIOMotorDatabase = Depends(get_db)
|
|
):
|
|
"""Login with email and password"""
|
|
user = await authenticate_user(db, credentials)
|
|
|
|
if user is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Invalid email or password"
|
|
)
|
|
|
|
# Create JWT token
|
|
access_token = create_access_token(user["_id"])
|
|
|
|
# Set HTTPOnly cookie
|
|
response.set_cookie(
|
|
key="access_token",
|
|
value=f"Bearer {access_token}",
|
|
httponly=True,
|
|
max_age=86400, # 24 hours
|
|
samesite="lax"
|
|
)
|
|
|
|
return {
|
|
"message": "Login successful",
|
|
"user": {
|
|
"_id": user["_id"],
|
|
"email": user["email"],
|
|
"full_name": user["full_name"]
|
|
},
|
|
"access_token": access_token
|
|
}
|
|
|
|
|
|
@router.post("/logout")
|
|
async def logout(response: Response):
|
|
"""Logout and clear authentication cookie"""
|
|
response.delete_cookie(key="access_token")
|
|
return {"message": "Logout successful"}
|
|
|
|
|
|
@router.get("/me", response_model=UserResponse)
|
|
async def get_me(user: dict = Depends(require_auth)):
|
|
"""Get current authenticated user"""
|
|
return UserResponse(
|
|
_id=user["_id"],
|
|
email=user["email"],
|
|
full_name=user["full_name"],
|
|
created_at=user["created_at"]
|
|
)
|