68 lines
2.6 KiB
Markdown
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
|