Comment rediriger l'utilisateur après une-connexion réussie

Apprends à rediriger l’utilisateur vers la page initiale après login dans React Router 7 pour une expérience fluide et sans perte de contexte.

3 min read
Déverrouillez votre potentiel

avec React Router 7

Vous en avez marre de...

❌ perdre du temps à chercher des informations éparpillées
❌ ne pas avoir de retour sur votre progression
Assistant IA spécialisé

Posez vos questions 24/7 à notre IA experte en React Router 7

Quiz interactifs

Validez vos acquis avec des quiz personnalisés et un feedback instantané

9 modules
45 leçons
Accès à vie
299.00
-50%

Rediriger l’utilisateur vers la page qu’il voulait vraiment voir

Tu viens de protéger tes routes avec requireUser(). 💡 Problème : si un visiteur non connecté tape /profile, il est envoyé sur /login… et, une fois authentifié, il atterrit sur la home ! Pas terrible : on veut revenir sur la page initialement demandée.

Nous allons :

  1. Mémoriser l’URL que l’utilisateur essayait d’atteindre.
  2. L’insérer comme paramètre dans la redirection vers /login.
  3. La lire dans l’action du formulaire pour refaire la bonne redirection.

Objectif UX : aucune perte de contexte, même après expiration de cookie ou connexion obligatoire sur une page « admin ».


1. Récupérer le chemin demandé dans requireUser

app/server/sessions.server.ts
1
export async function requireUser({ request }: { request: Request }) {
2
const user = await getOptionalUser({ request })
3
if (user) return user // déjà connecté
4
5
const url = new URL(request.url) // ① parse l’URL
6
const pathname = url.pathname // ② ex: "/profile"
7
8
// ③ on ajoute le paramètre redirectTo
9
throw redirect(`/login?redirectTo=${pathname}`)
10
}

Points clés :

  • new URL(request.url) te donne l’objet complet (host, query, pathname…).
  • On transmet uniquement le pathname (pas la query) ; c’est ce qu’on souhaite rejouer après le login.

2. Lire redirectTo dans l’action de /login

app/routes/login.tsx
1
import {
2
commitSession,
3
getUserSession,
4
} from "~/server/sessions.server"
5
6
export async function action({ request }: ActionFunctionArgs) {
7
const session = await getUserSession({ request })
8
9
/* ici : vérifie email + password → ok */
10
11
session.set("userId", "10") // user connecté
12
13
// ① on relit l’URL d’origine
14
const url = new URL(request.url)
15
const search = url.searchParams
16
const redirectTo = search.get("redirectTo") || "/"
17
18
// ② on renvoie le cookie ET la redirection appropriée
19
return redirect(redirectTo, {
20
headers: {
21
"Set-Cookie": await commitSession(session),
22
},
23
})
24
}

Si aucun paramètre n’est présent, on retombe sur la page d’accueil par défaut : || "/".


3. Tester le flux complet

Terminal
1
# 1. Visiteur non connecté
2
GET /profile → requireUser() 302 /login?redirectTo=/profile
3
4
# 2. Formulaire POST /login
5
POST /login → action() 302 /profile + Set-Cookie

✅ L’utilisateur est arrivé exactement là où il voulait aller, sans double clic ni Home surprise.


Tu pourrais écrire session.set("redirectTo", pathname)… mais :

  • Cela nécessite un cookie supplémentaire (ou des lectures/écritures inutiles dans la session).
  • Tu risques un conflit si l’utilisateur ouvre plusieurs onglets avec différentes pages protégées.
  • Le paramètre d’URL est stateless : il suit la requête, point.

Règle d’or : garde la session pour le qui (userId, tokens) et l’URL pour le (chemin cible).


Tout rassembler dans un hook côté client

Dans root.tsx, tu charges déjà user ; ajoute un hook pour lire le paramètre redirectTo (pratique pour afficher un message « Connecte-toi pour accéder à /courses »).

app/root.tsx
1
export function useRedirectAfterLogin() {
2
const location = useLocation()
3
const params = new URLSearchParams(location.search)
4
return params.get("redirectTo") ?? "/"
5
}

Ce que tu viens de mettre en place

ÉtapeCodeRôle
1requireUser()Ajoute ?redirectTo= + pathname
2action() de /loginLit ce paramède, fallback “/”
3redirect()Envoie l’utilisateur sur la page voulue

Le tout en ≈ 15 lignes, 100 % server-side, zéro JS côté client.

Premium
Quiz interactif
Testez vos connaissances et validez votre compréhension du module avec notre quiz interactif.
1

Comprendre les concepts fondamentaux

Quelle est la principale différence entre les composants client et serveur dans React ?

Les composants client s'exécutent uniquement dans le navigateur
Les composants serveur peuvent utiliser useState
Les composants client sont plus rapides
Il n'y a aucune différence significative
2

Optimisation des performances

Quelle technique est recommandée pour éviter les rendus inutiles dans React ?

Utiliser React.memo pour les composants fonctionnels
Ajouter plus d'états locaux
Éviter d'utiliser les props
Toujours utiliser les class components
3

Architecture des données

Quel hook permet de gérer les effets de bord dans un composant React ?

useEffect
useState
useMemo
useContext
4

Gestion des erreurs

Comment implémenter la gestion des erreurs pour les requêtes API dans React ?

Utiliser try/catch avec async/await
Ignorer les erreurs
Toujours afficher un message d'erreur
Rediriger l'utilisateur
5

Déploiement et CI/CD

Quelle est la meilleure pratique pour déployer une application React en production ?

Utiliser un service CI/CD comme GitHub Actions
Copier les fichiers manuellement via FTP
Envoyer le code source complet
Ne jamais mettre à jour l'application

Débloquez ce quiz et tous les autres contenus premium en achetant ce cours