[DOC] Solution: Problème Register identifié - Validation password trop stricte

- Problème: TestPassword123! rejeté car contient 'password'
- Solution: Utiliser mot de passe sans mots communs (ex: Xk9$mP2#vL7@nQ4!wR8)
- Base de données fonctionne correctement
- Logs d'erreur améliorés pour diagnostic futur
This commit is contained in:
senke 2025-12-26 23:26:12 +01:00
parent 4e0d436bf9
commit 7df5b92af0

View file

@ -0,0 +1,222 @@
# ✅ SOLUTION : Endpoint d'enregistrement `/api/v1/auth/register`
**Date**: 2025-12-26
**Status**: ✅ **PROBLÈME IDENTIFIÉ ET RÉSOLU**
---
## 🔍 DIAGNOSTIC COMPLET
### Problème identifié
L'erreur **code 9000 "Failed to create user"** n'était **PAS** causée par un problème de base de données, mais par la **validation du mot de passe** qui est trop stricte.
### Preuve
**Logs du backend** :
```
>>> REGISTER: Password validation FAILED: [Password contains common words or patterns]
```
**Cause** : Le mot de passe `TestPassword123!` contient le mot "password" qui est dans la liste des mots communs interdits.
**Code responsable** : `veza-backend-api/internal/validators/password_validator.go` (lignes 68-76)
```go
// Check for common weak passwords
passwordLower := strings.ToLower(password)
for _, common := range commonPasswords {
if strings.Contains(passwordLower, common) {
strength.Valid = false
strength.Details = append(strength.Details,
"Password contains common words or patterns")
return strength, nil
}
}
```
**Liste des mots interdits** (ligne 15-23) :
- "password", "password1", "passw0rd"
- "12345678", "123456789", "1234567890"
- "qwerty", "abc123", "admin"
- etc.
---
## ✅ VÉRIFICATIONS EFFECTUÉES
1. ✅ **Base de données** : Fonctionne correctement
- ENUM `user_role` existe
- Contraintes CHECK correctes
- Insertion directe réussie
2. ✅ **Schéma** : Correct
- Tous les champs NOT NULL sont initialisés
- Types de données corrects
3. ✅ **Code** : Fonctionne correctement
- Validation email : OK
- Validation username : OK
- **Validation password : TROP STRICTE**
---
## 🛠️ SOLUTIONS POSSIBLES
### Solution 1 : Utiliser un mot de passe différent pour les tests ⚡ **RECOMMANDÉ POUR MVP**
**Changement** : Utiliser un mot de passe qui ne contient pas de mots communs.
**Exemples de mots de passe valides** :
- `MySecureP@ss2024!`
- `V3z@Str0ngP@ss!`
- `Xk9$mP2#vL7@nQ4!wR8` (déjà utilisé dans les tests E2E)
**Avantages** :
- ✅ Pas de modification du code
- ✅ Sécurité maintenue
- ✅ Tests fonctionnent immédiatement
**Inconvénients** :
- ⚠️ Nécessite de changer les mots de passe dans les tests
---
### Solution 2 : Assouplir la validation pour le MVP ⚠️ **TEMPORAIRE**
**Changement** : Modifier `password_validator.go` pour être moins strict en développement.
```go
// Dans password_validator.go
func (v *PasswordValidator) Validate(password string) (PasswordStrength, error) {
// ... validations existantes ...
// MVP: Désactiver vérification mots communs en développement
if os.Getenv("ENVIRONMENT") == "development" {
// Skip common password check in dev
} else {
// Check for common weak passwords
passwordLower := strings.ToLower(password)
for _, common := range commonPasswords {
if strings.Contains(passwordLower, common) {
strength.Valid = false
strength.Details = append(strength.Details,
"Password contains common words or patterns")
return strength, nil
}
}
}
// ... reste du code ...
}
```
**Avantages** :
- ✅ Tests fonctionnent avec n'importe quel mot de passe
- ✅ Sécurité maintenue en production
**Inconvénients** :
- ⚠️ Moins sécurisé en développement
- ⚠️ Nécessite modification du code
---
### Solution 3 : Améliorer la logique de détection ⚡ **LONG TERME**
**Changement** : Ne pas rejeter un mot de passe qui contient un mot commun si :
- Le mot de passe est suffisamment long (≥16 caractères)
- Le mot de passe contient suffisamment de variété (majuscules, minuscules, chiffres, caractères spéciaux)
- Le mot commun n'est pas le mot de passe entier
```go
// Check for common weak passwords
passwordLower := strings.ToLower(password)
for _, common := range commonPasswords {
if strings.Contains(passwordLower, common) {
// Si le mot de passe est très long et complexe, permettre
if len(password) >= 16 &&
hasUpper.MatchString(password) &&
hasLower.MatchString(password) &&
hasNumber.MatchString(password) &&
hasSpecial.MatchString(password) &&
passwordLower != common {
// Mot de passe suffisamment complexe malgré le mot commun
continue
}
strength.Valid = false
strength.Details = append(strength.Details,
"Password contains common words or patterns")
return strength, nil
}
}
```
**Avantages** :
- ✅ Plus intelligent
- ✅ Sécurité maintenue
- ✅ Plus flexible pour les utilisateurs
**Inconvénients** :
- ⚠️ Plus complexe à maintenir
- ⚠️ Nécessite tests supplémentaires
---
## 📋 ACTIONS IMMÉDIATES
### Pour les tests E2E
**Changer les mots de passe dans** :
- `apps/web/e2e/utils/test-helpers.ts` : `TEST_USERS.default.password`
- `apps/web/e2e/global-setup.ts` : Mot de passe du test user
- Scripts de test : `test_protected_endpoints.sh`
**Nouveau mot de passe recommandé** : `Xk9$mP2#vL7@nQ4!wR8` (déjà utilisé, fonctionne)
### Pour les tests manuels
Utiliser un mot de passe qui :
- ✅ Fait au moins 12 caractères
- ✅ Contient majuscules, minuscules, chiffres, caractères spéciaux
- ✅ Ne contient **PAS** : "password", "test", "123", "admin", "qwerty", etc.
**Exemples** :
- `MySecureP@ss2024!`
- `V3z@Str0ngP@ss!`
- `Xk9$mP2#vL7@nQ4!wR8`
---
## 📊 RÉSUMÉ
| Élément | Status | Détails |
|---------|--------|---------|
| Base de données | ✅ OK | ENUM, contraintes, insertion directe fonctionnent |
| Schéma | ✅ OK | Tous les champs NOT NULL initialisés |
| Validation email | ✅ OK | Fonctionne correctement |
| Validation username | ✅ OK | Fonctionne correctement |
| **Validation password** | ❌ **TROP STRICTE** | Rejette "TestPassword123!" car contient "password" |
| Logs d'erreur | ✅ AMÉLIORÉ | Logs détaillés ajoutés pour diagnostic |
---
## ✅ CONCLUSION
**Le problème n'était PAS dans la base de données**, mais dans la **validation du mot de passe** qui rejette les mots de passe contenant des mots communs comme "password".
**Solution immédiate** : Utiliser un mot de passe différent pour les tests qui ne contient pas de mots communs.
**Solution long terme** : Améliorer la logique de validation pour être plus intelligente (Solution 3).
---
## 🔗 FICHIERS MODIFIÉS
1. ✅ `veza-backend-api/internal/core/auth/service.go` : Logs d'erreur améliorés
2. ✅ `veza-backend-api/internal/handlers/auth.go` : Logs d'erreur améliorés
3. ✅ `REGISTER_ENDPOINT_AUDIT.md` : Audit complet créé
4. ✅ `REGISTER_ENDPOINT_SOLUTION.md` : Solution documentée (ce fichier)
---
**Prochaine étape** : Mettre à jour les mots de passe dans les tests E2E pour utiliser un mot de passe valide.