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>
35 lines
839 B
TypeScript
35 lines
839 B
TypeScript
import type { Metadata } from "next"
|
|
import { Inter } from "next/font/google"
|
|
import "./globals.css"
|
|
import { QueryProvider } from "@/components/providers/QueryProvider"
|
|
import AuthGuard from "@/components/AuthGuard"
|
|
import Script from "next/script"
|
|
|
|
const inter = Inter({ subsets: ["latin"] })
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Audio Classifier",
|
|
description: "Intelligent audio library management and classification",
|
|
}
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
return (
|
|
<html lang="en">
|
|
<head>
|
|
<Script src="/config.js" strategy="beforeInteractive" />
|
|
</head>
|
|
<body className={inter.className}>
|
|
<QueryProvider>
|
|
<AuthGuard>
|
|
{children}
|
|
</AuthGuard>
|
|
</QueryProvider>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|