44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
"""Authentication endpoints."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, Request
|
|
|
|
from app.api.deps import get_auth_context
|
|
from app.model.schemas import AuthContext, LoginRequest
|
|
from app.service.audit_service import audit_service
|
|
from app.service.auth_service import auth_service
|
|
from app.utils.exceptions import AuthenticationError
|
|
from app.utils.response import success_response
|
|
|
|
router = APIRouter()
|
|
AUTH_CONTEXT_DEP = Depends(get_auth_context)
|
|
|
|
|
|
@router.post("/login")
|
|
def login(payload: LoginRequest, request: Request):
|
|
try:
|
|
token, user = auth_service.authenticate_dev_user(payload.username, payload.password)
|
|
except AuthenticationError:
|
|
audit_service.record(
|
|
trace_id=request.state.trace_id,
|
|
event_type="auth_login_failed",
|
|
actor_id=payload.username or "anonymous",
|
|
agent_type="platform",
|
|
decision="invalid_credentials",
|
|
)
|
|
raise
|
|
audit_service.record(
|
|
trace_id=request.state.trace_id,
|
|
event_type="auth_login",
|
|
actor_id=user.user_id,
|
|
agent_type="platform",
|
|
decision="success",
|
|
)
|
|
return success_response(request, {"access_token": token, "token_type": "bearer", "user": user.model_dump()})
|
|
|
|
|
|
@router.get("/me")
|
|
def me(request: Request, auth: AuthContext = AUTH_CONTEXT_DEP):
|
|
return success_response(request, auth.model_dump())
|