2.6 KiB
Correction : Déconnexion automatique lors de la création d'un mot de passe
🐛 Problème
Lorsqu'un utilisateur créait ou mettait à jour son mot de passe via la page Compte > Sécurité, il était automatiquement déconnecté de son compte.
🔍 Cause
L'API /api/auth/password-update utilisait la méthode admin.auth.admin.updateUserById() de Supabase (Admin API) pour modifier le mot de passe.
Comportement de Supabase : Par défaut, pour des raisons de sécurité, l'Admin API invalide automatiquement toutes les sessions actives d'un utilisateur lorsqu'on modifie son mot de passe. Ce comportement assume qu'un changement de mot de passe doit forcer une reconnexion.
✅ Solution
Remplacement de l'Admin API par la méthode supabase.auth.updateUser() qui permet de mettre à jour le mot de passe sans invalider la session active.
Changements apportés
Fichier : /app/api/auth/password-update/route.ts
Avant :
// Utilisation de l'Admin API (invalide la session)
const admin = createClient(url, serviceKey);
const { error: updErr } = await admin.auth.admin.updateUserById(userId, {
password: newPassword,
user_metadata: {
...session.user.user_metadata,
hasPassword: true
}
});
Après :
// Utilisation de updateUser() (préserve la session)
const { error: updErr } = await supabase.auth.updateUser({
password: newPassword,
data: {
...session.user.user_metadata,
hasPassword: true
}
});
🎯 Résultat
- ✅ L'utilisateur peut créer/modifier son mot de passe sans être déconnecté
- ✅ La session reste active après la mise à jour
- ✅ L'email de confirmation est toujours envoyé
- ✅ Toutes les validations de sécurité du mot de passe sont conservées
📝 Notes techniques
updateUser(): Met à jour les informations de l'utilisateur authentifié via sa session activeadmin.updateUserById(): Met à jour un utilisateur via l'Admin API (invalide toutes les sessions pour sécurité)
La méthode updateUser() est appropriée ici car :
- L'utilisateur est authentifié et modifie son propre mot de passe
- Il n'y a pas de raison de le déconnecter immédiatement
- C'est une action volontaire de l'utilisateur (pas une récupération de mot de passe compromise)
🔒 Sécurité
Le changement de mot de passe reste sécurisé :
- Validation stricte du mot de passe (12+ caractères, majuscules, minuscules, chiffres, caractères spéciaux)
- Email de confirmation envoyé
- L'utilisateur doit être authentifié pour accéder à cette API