Dependency Injection
The backend uses FastAPI's native dependency injection engine (Depends) to decouple authentication enforcement, user status validations, and session hydration from core application logic.
1. Security Dependency Hierarchy
Endpoints enforce authentication by chaining modular validation dependencies:
graph TD
Req[Incoming HTTP Request] --> Handler[Endpoint Function Definition]
subgraph "FastAPI Dependency Resolution Graph"
Handler --> ActiveUser[Depends: `get_current_active_user`]
ActiveUser --> CurrentUser[Depends: `get_current_user`]
CurrentUser --> Scheme[OAuth2PasswordBearer Scheme Handler]
end
Scheme -- Extracts Bearer Header --> AuthHeader[Authorization Token]
Resolution Flow
OAuth2PasswordBearer: Extracts raw tokens from request authorization headers.get_current_user: Decodes JWT payloads, verifies internal signing keys, and restores associated MongoDB user accounts.get_current_active_user: Inspects user claims to confirm active account status, rejecting disabled users.
2. Injection Patterns in Routes
By injecting dependencies directly into endpoint signatures, route functions remain clean and focused on business execution:
@router.post("/generate", response_model=DashboardResponse)
async def generate_dashboard(
request: DashboardGenerateRequest,
current_user: User = Depends(get_current_active_user),
):
# Route execution receives a fully validated User instance.
username = current_user.username
...
Benefits of Explicit Dependencies
- Type Safety: IDEs and linters validate downstream consumer interfaces natively.
- Testability: Tests can swap out authentication models by overriding dependency mappings (
app.dependency_overrides).