ggen_api/middleware/
auth.rs

1//! Authentication middleware
2
3use axum::{
4    extract::{Request, State},
5    middleware::Next,
6    response::Response,
7};
8use std::sync::Arc;
9
10use crate::state::AppState;
11
12/// User information extracted from JWT token
13#[derive(Debug, Clone)]
14pub struct User {
15    pub id: String,
16    pub email: String,
17    pub tier: String,
18}
19
20/// Middleware to verify JWT tokens
21pub async fn verify_jwt(
22    State(_state): State<AppState>,
23    mut request: Request,
24    next: Next,
25) -> Response {
26    // TODO: Extract Authorization header
27    // TODO: Verify JWT signature
28    // TODO: Check expiration
29    // TODO: Extract claims
30    // TODO: Add User to request extensions
31
32    next.run(request).await
33}
34
35/// Middleware to require authentication
36pub async fn require_auth(
37    State(_state): State<AppState>,
38    request: Request,
39    next: Next,
40) -> Response {
41    // TODO: Check if User is in request extensions
42    // TODO: Return 401 if not authenticated
43
44    next.run(request).await
45}
46
47/// Middleware to require specific tier
48pub async fn require_tier(min_tier: &str) -> impl Fn(Request, Next) -> futures::future::BoxFuture<'static, Response> + Clone + use<'_> {
49    move |request: Request, next: Next| {
50        let _tier = min_tier.to_string();
51        Box::pin(async move {
52            // TODO: Get User from request extensions
53            // TODO: Check tier hierarchy: free < pro < enterprise
54            // TODO: Return 403 if tier insufficient
55
56            next.run(request).await
57        })
58    }
59}