espace-paie-odentas/FIX_PASSWORD_DECONNEXION.md

68 lines
2.6 KiB
Markdown

# 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 :
```typescript
// 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 :
```typescript
// 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 active
- **`admin.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 :
1. L'utilisateur est authentifié et modifie son propre mot de passe
2. Il n'y a pas de raison de le déconnecter immédiatement
3. 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