Routes protégées
Dans certaines cas, on voudrait que certaines pages de notre application ne puissent être accessible qu’à un utilisateur connecté (par exemple la page Dashboard). Avec React en Data Mode, on peut tout à fait le faire en mettant en place un “garde” (Guard) qui s’exécute au niveau du loader avant d’afficher la page.
Fonction utilitaire requireAuth
Cette fonction est un middleware côté client : elle vérifie si l’utilisateur est connecté et, sinon, le redirige intelligemment.
// services/auth.js
import { redirect } from "react-router-dom"
import { getCurrentUser } from "../services/api"
export async function requireAuth() {
try {
// 1. On demande au backend NestJS : "Qui suis-je ?"
// Si le cookie de session est invalide, l'API lancera une erreur 401
return await getCurrentUser()
} catch (error) {
// 3. Si non autorisé, on redirige vers /login pour qu'il se connecte
throw redirect(`/login`)
}
}Utilisation dans les Loaders
Pour protéger une route, il suffit d’appeler requireAuth à la première ligne de son loader. Si la fonction “throw” une redirection, le reste du loader ne s’exécutera jamais.
Exemple avec host-dashboard.loader.js :
import { getHostVans } from "/src/services/api"
import { requireAuth } from "/src/services/auth"
export async function hostDashboardLoader() {
// ÉTAPE 1 : Le garde vérifie l'accès
const user = await requireAuth()
// ÉTAPE 2 : On ne récupère les données privées QUE si l'étape 1 a réussi
const vans = await getHostVans(user.id)
return { vans: vans, user: user }
} authLoader : Garde sans récupération de données
Parfois, vous avez des routes qui doivent être sécurisées, mais qui n’ont pas à récupérer des données. Au lieu de réécrire la logique à chaque fois, on crée un authLoader réutilisable.
Fonction authLoader
C’est un loader minimaliste. Son seul rôle est de servir de “garde” en appelant notre fonction requireAuth.
// loaders/auth.loader.js
import { requireAuth } from "/src/services/auth"
export async function authLoader() {
// On attend que requireAuth vérifie la session auprès de NestJS
// Si l'utilisateur n'est pas connecté, requireAuth jettera (throw) une redirection
return await requireAuth()
}Utilisation dans App.jsx
L’avantage est majeur : vous pouvez protéger n’importe quelle route en une seule ligne, sans créer de fichier loader spécifique pour chaque page.
// App.jsx
import { authLoader } from "./loaders/auth.loader.js"
<Route
path="income"
element={<Income />}
loader={authLoader}
/>
<Route
path="reviews"
element={<Reviews />}
loader={authLoader}
/>