[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:
parent
4e0d436bf9
commit
7df5b92af0
1 changed files with 222 additions and 0 deletions
222
REGISTER_ENDPOINT_SOLUTION.md
Normal file
222
REGISTER_ENDPOINT_SOLUTION.md
Normal 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.
|
||||
|
||||
Loading…
Reference in a new issue