58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
"""Authentication API routes."""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from ..database import get_db
|
|
from ..schemas.user import UserLogin, Token, UserResponse
|
|
from ..services.auth_service import AuthService
|
|
from .deps import get_current_user
|
|
from ..models.user import User
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/login", response_model=Token)
|
|
def login(
|
|
credentials: UserLogin,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""Authenticate user and return JWT tokens."""
|
|
auth_service = AuthService(db)
|
|
user = auth_service.authenticate_user(credentials.username, credentials.password)
|
|
|
|
if not user:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Incorrect username or password",
|
|
headers={"WWW-Authenticate": "Bearer"}
|
|
)
|
|
|
|
return auth_service.create_tokens(user)
|
|
|
|
|
|
@router.post("/refresh", response_model=Token)
|
|
def refresh_token(
|
|
refresh_token: str,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""Refresh access token using refresh token."""
|
|
auth_service = AuthService(db)
|
|
tokens = auth_service.refresh_tokens(refresh_token)
|
|
|
|
if not tokens:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Invalid refresh token",
|
|
headers={"WWW-Authenticate": "Bearer"}
|
|
)
|
|
|
|
return tokens
|
|
|
|
|
|
@router.get("/me", response_model=UserResponse)
|
|
def get_current_user_info(
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
"""Get current authenticated user information."""
|
|
return current_user
|