Récapitulatif complet de l'authentification dans React Router 7 pour une app sécurisée. Inscription, session, e-mail et meilleures pratiques.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
En un (long) module tu viens de transformer un simple CRUD en une application full-stack sécurisée :
bcryptjs
et jamais stockés en clair.__session
.getOptionalUser()
/ requireUser()
.redirectTo
).zod
, pour
éviter la production qui plante parce qu’un SMTP_HOST
manque.En clair : tout ce qu’il faut pour mettre l’appli en production sans transpirer.
requireUser()
supprime le cookie corrompu, redirige l’anonyme vers
/login?redirectTo=/route-demandée
et garantit qu’aucune page privée
n’échappe au contrôle./reset-password?token=…
qui valide le token, écrit le nouveau
hash puis invalide le token : un seul usage possible.superRefine
).
Résultat : moins de code, 0 état local, type-safety totale.sendPasswordResetEmail()
centralise le transporteur
nodemailer
, le template HTML et le fallback texte.
Tu peux le réutiliser pour des confirmations d’inscription, des
newsletters, etc..env
passent par envServerSchema.parse(process.env)
; si
DATABASE_URL
ou SMTP_PASSWORD
est manquant, l’app s’arrête dès le
boot plutôt que de planter silencieusement plus tard.1import { redirect } from "react-router";23export async function requireUser({ request }: { request: Request }) {4const user = await getOptionalUser({ request });5if (!user) {6const path = new URL(request.url).pathname;7throw await logout({8request,9redirectTo: `/login?redirectTo=${path}`,10});11}12return user;13}
1export async function logout({2request,3redirectTo = "/",4}: {5request: Request;6redirectTo?: string;7}) {8const session = await getUserSession({ request });9return redirect(redirectTo, {10headers: { "Set-Cookie": await destroySession(session) },11});12}
1export async function sendPasswordResetEmail({2email,3token,4}: {5email: string;6token: string;7}) {8const url = `${process.env.FRONTEND_URL}/reset-password?token=${token}`;910await sendEmail({11to: email,12subject: "Réinitialisation de ton mot de passe",13text: `Clique sur le lien suivant : ${url}`,14html: `<p>Tu as demandé un nouveau mot de passe.</p>15<p><a href="${url}">Réinitialiser maintenant</a></p>16<small>Ce lien expire dans 30 min.</small>`,17});18}
Compétence | Statut |
---|---|
Prisma : migrations & seed | ✅ |
Bcrypt : hash & vérification | ✅ |
Session cookie sécurisé (httpOnly ) | ✅ |
Gestion d’erreurs typée submission.reply() | ✅ |
Envoi d’e-mail SMTP | ✅ |
Validation d’environnement avec Zod | ✅ |
Tu maîtrises maintenant tout le socle « Auth » pour n’importe quel projet React Router 7.
La partie la plus critique est en place. Dans le prochain module nous allons :
Prêt·e à publier ton app ? Alors enchaîne directement sur le module « Déploiement d’une application React Router 7 » !
Si tu bloques sur une étape, poste un message sur le Discord Algomax. La communauté (et moi) sommes là pour t’aider !
Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?