Conclusion authentification
Récapitulatif complet de l'authentification dans React Router 7 pour une app sécurisée. Inscription, session, e-mail et meilleures pratiques.
Récapitulatif express : où en est ton app ?
En un (long) module tu viens de transformer un simple CRUD en une application full-stack sécurisée :
- Inscription, connexion, déconnexion et ré-initialisation de mot de passe.
- Mots de passe hachés avec
bcryptjset jamais stockés en clair. - Sessions HTTP-only signées, stockées dans un cookie unique
__session. - Routes protégées grâce au duo
getOptionalUser()/requireUser(). - Redirection automatique vers la page initiale après login (
redirectTo). - E-mail transactionnel envoyé via Nodemailer + SMTP.
- Variables d’environnement validées au démarrage avec
zod, pour éviter la production qui plante parce qu’unSMTP_HOSTmanque.
En clair : tout ce qu’il faut pour mettre l’appli en production sans transpirer.
Les enseignements clés (reformulés du transcript)
- UX first
- Message d’erreur directement dans le formulaire si le slug ou le mot de passe est mauvais.
- Focus auto sur le champ fautif, pas de reset du formulaire.
- Garde-fou universel
requireUser()supprime le cookie corrompu, redirige l’anonyme vers/login?redirectTo=/route-demandéeet garantit qu’aucune page privée n’échappe au contrôle. - Flow « Mot de passe oublié »
- Génération d’un token unique + date d’expiration.
- Lien envoyé par e-mail.
- Page
/reset-password?token=…qui valide le token, écrit le nouveau hash puis invalide le token : un seul usage possible.
- Conform + Zod, le binôme gagnant
Un schéma → deux usages : validation instantanée côté client et
validation asynchrone côté serveur (
superRefine). Résultat : moins de code, 0 état local, type-safety totale. - Envoi d’e-mail industrialisé
Un helper
sendPasswordResetEmail()centralise le transporteurnodemailer, le template HTML et le fallback texte. Tu peux le réutiliser pour des confirmations d’inscription, des newsletters, etc. - Environnement typé
Les variables
.envpassent parenvServerSchema.parse(process.env); siDATABASE_URLouSMTP_PASSWORDest manquant, l’app s’arrête dès le boot plutôt que de planter silencieusement plus tard.
Les morceaux de code à garder sous la main
Le coupe-circuit d’authentification
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}
La déconnexion qui vide vraiment le cookie
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}
L’envoi d’un e-mail de reset de mot de passe
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}
Bilan compétences
| 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.
Et après ?
La partie la plus critique est en place. Dans le prochain module nous allons :
- Déployer l’application (Docker, CI/CD, variables d’env en production).
- Mettre en place des outils de monitoring (logs, erreurs, performances).
- Optimiser le SEO et la performance grâce aux headers, aux balises meta et au pré-chargement des ressources.
Prêt·e à publier ton app ? Alors enchaîne directement sur le module « Déploiement d’une application React Router 7 » !
Important
Si tu bloques sur une étape, poste un message sur le Discord Algomax. La communauté (et moi) sommes là pour t’aider !
Comprendre les concepts fondamentaux
Quelle est la principale différence entre les composants client et serveur dans React ?
Optimisation des performances
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Architecture des données
Quel hook permet de gérer les effets de bord dans un composant React ?