Backend: - Nouveau module auth.py avec JWT et password handling - Endpoint /api/auth/login (public) - Endpoint /api/auth/me (protégé) - TOUS les endpoints API protégés par require_auth - Variables env: ADMIN_EMAIL, ADMIN_PASSWORD, JWT_SECRET_KEY - Dependencies: python-jose, passlib Frontend: - Page de login (/login) - AuthGuard component pour redirection automatique - Axios interceptor: ajoute JWT token à chaque requête - Gestion erreur 401: redirect automatique vers /login - Bouton logout dans header - Token stocké dans localStorage Configuration: - .env.example mis à jour avec variables auth - Credentials admin configurables via env Sécurité: - Aucun endpoint public (sauf /api/auth/login et /health) - JWT expiration configurable (24h par défaut) - Password en clair dans env (à améliorer avec hash en prod) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
38 lines
946 B
TypeScript
38 lines
946 B
TypeScript
"use client"
|
|
|
|
import { useEffect, useState } from "react"
|
|
import { useRouter, usePathname } from "next/navigation"
|
|
import { isAuthenticated } from "@/lib/auth"
|
|
|
|
export default function AuthGuard({ children }: { children: React.ReactNode }) {
|
|
const router = useRouter()
|
|
const pathname = usePathname()
|
|
const [isChecking, setIsChecking] = useState(true)
|
|
|
|
useEffect(() => {
|
|
// Skip auth check for login page
|
|
if (pathname === "/login") {
|
|
setIsChecking(false)
|
|
return
|
|
}
|
|
|
|
// Check if user is authenticated
|
|
if (!isAuthenticated()) {
|
|
router.push("/login")
|
|
} else {
|
|
setIsChecking(false)
|
|
}
|
|
}, [pathname, router])
|
|
|
|
// Show loading while checking auth
|
|
if (isChecking && pathname !== "/login") {
|
|
return (
|
|
<div className="min-h-screen flex items-center justify-center bg-gray-900">
|
|
<div className="text-white">Loading...</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
return <>{children}</>
|
|
}
|