0. Page d'Authentification (AuthPageComponent)

Vue d'ensemble

La page d'authentification est le point d'entrée de l'application. Elle permet aux utilisateurs de se connecter avec un compte existant ou de créer un nouveau compte. Cette page est protégée par le NoAuthGuard qui redirige automatiquement les utilisateurs déjà connectés vers la page d'accueil.

Localisation

Fichier: client/src/app/pages/auth-page/auth-page.component.ts

Route: /auth

Fonctionnalités Principales

Mode Connexion

Permet aux utilisateurs de se connecter avec leurs identifiants existants.

Champs du formulaire:

Processus de connexion:

  1. L'utilisateur saisit son username et mot de passe
  2. Le formulaire est validé côté client
  3. AuthService.signInWithUsername() est appelé
  4. Le service récupère l'email associé au username (requête HTTP)
  5. Connexion Firebase avec l'email et le mot de passe
  6. Création de session côté serveur
  7. Authentification du socket avec le session ID
  8. Redirection vers la page d'accueil

Mode Inscription

Permet aux nouveaux utilisateurs de créer un compte.

Champs du formulaire:

Processus d'inscription:

  1. L'utilisateur saisit les informations requises
  2. Validation du format du username (regex: ^[a-zA-Z0-9_]+$)
  3. Vérification de disponibilité du username via AuthService.checkUsernameAvailability()
  4. Sélection optionnelle d'un avatar
  5. AuthService.signUp() est appelé avec les informations
  6. Création du compte Firebase
  7. Upload de l'avatar si fourni (multipart/form-data)
  8. Enregistrement de l'utilisateur dans MongoDB
  9. Connexion automatique après inscription

Gestion des Avatars

Format supportés: JPEG, JPG, PNG, GIF, WEBP

Taille maximale: 10 MB

Fonctionnalités:

Validation:

const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
const maxSize = 10 * 1024 * 1024; // 10MB

Services Utilisés

AuthService

Méthodes principales:

signInWithUsername(username: string, password: string)

signUp(email: string, password: string, username: string, avatarFile?: File)

checkUsernameAvailability(username: string)

getIdToken()

Traduction des erreurs Firebase:
Le service traduit automatiquement les codes d'erreur Firebase en messages compréhensibles en français :

SocketService

Méthode utilisée:

authenticateSocket(sessionId: string)

Composants Utilisés

OneButtonPopupComponent

Utilisé pour afficher des messages d'information ou d'erreur, notamment :

Props:

Validation du Formulaire

Connexion

Règles de validation:

Inscription

Règles de validation:

État de Validation

Variables d'état:

isCheckingUsername: boolean  // Requête HTTP en cours
hasCheckedUsername: boolean  // Au moins une vérification effectuée
isUsernameAvailable: boolean // Résultat de la vérification

Logique de soumission:

Gestion des Erreurs

Erreurs d'Authentification

Compte déjà connecté (ALREADY_CONNECTED):

Identifiants invalides:

Erreurs Firebase:

Erreurs de Validation

Username non disponible:

Avatar invalide:

Champs manquants:

État du Composant

Variables principales:

isLoginMode: boolean              // true = connexion, false = inscription
loginUsername: string             // Username pour connexion
email: string                     // Email pour inscription
password: string                  // Mot de passe
username: string                  // Username pour inscription
errorMessage: string              // Message d'erreur affiché
isLoading: boolean                // État de chargement global
isCheckingUsername: boolean       // Vérification username en cours
showPassword: boolean             // Affichage du mot de passe
isPopupActive: boolean            // Popup active
popupMessage: string              // Message de la popup
isUsernameAvailable: boolean      // Username disponible
hasCheckedUsername: boolean       // Username vérifié au moins une fois
selectedAvatarFile: File | null   // Fichier avatar sélectionné
selectedAvatarPreview: string | null  // URL de prévisualisation
avatarError: string               // Erreur d'avatar

Méthodes Principales

toggleMode()

Bascule entre mode connexion et inscription, réinitialise tous les champs.

onSubmit()

Soumet le formulaire après validation complète.

Flux:

  1. Validation du formulaire via isFormValid()
  2. Activation de isLoading
  3. Appel du service approprié (signIn ou signUp)
  4. Si succès et session ID fourni : authentification du socket
  5. Redirection vers /home
  6. Si erreur : affichage du message d'erreur

checkUsernameAvailability()

Vérifie la disponibilité du username en temps réel.

Flux:

  1. Vérification de la longueur minimum (3 caractères)
  2. Activation de isCheckingUsername
  3. Appel API via AuthService.checkUsernameAvailability()
  4. Mise à jour de isUsernameAvailable et hasCheckedUsername
  5. Affichage du message d'erreur si non disponible

onUsernameChange()

Réinitialise l'état de vérification quand l'utilisateur modifie le username.

onAvatarSelected(event: Event)

Gère la sélection d'un fichier avatar.

Flux:

  1. Récupération du fichier depuis l'input
  2. Validation du type MIME
  3. Validation de la taille
  4. Stockage du fichier dans selectedAvatarFile
  5. Création d'une prévisualisation avec FileReader
  6. Affichage des erreurs si validation échoue

triggerFileInput()

Ouvre le sélecteur de fichiers (uniquement en mode inscription).

togglePasswordVisibility()

Bascule l'affichage du mot de passe entre texte et masqué.

canSubmitForm()

Détermine si le bouton de soumission doit être activé.

Conditions:

clearForm()

Réinitialise tous les champs et états du formulaire (appelé lors du changement de mode).

Interface Utilisateur

Structure de la Page

Disposition:

Mode Connexion

Éléments:

+----------------------------------+
|            LOGO                  |
|                                  |
|  [x] Connexion  [ ] Inscription  |
|                                  |
|  Username: [_______________]     |
|                                  |
|  Password: [_______________] [👁] |
|                                  |
|  [Message d'erreur si présent]   |
|                                  |
|        [SE CONNECTER]            |
|                                  |
+----------------------------------+

Mode Inscription

Éléments:

+----------------------------------+
|            LOGO                  |
|                                  |
|  [ ] Connexion  [x] Inscription  |
|                                  |
|  Email:    [_______________]     |
|  Username: [_______________]     |
|            [Vérifier] ✓/✗        |
|  Password: [_______________] [👁] |
|                                  |
|  Avatar: [Sélectionner]          |
|         [Prévisualisation]       |
|                                  |
|  [Message d'erreur si présent]   |
|                                  |
|        [S'INSCRIRE]              |
|                                  |
+----------------------------------+

Style et Thème

Couleurs principales:

Typographie:

Animations:

Entrée sur la Page

Depuis:

Protection:

Sortie de la Page

Vers:

Conditions:

Cas d'Usage Typiques

Cas 1: Première Connexion

  1. Utilisateur accède à l'application
  2. AuthGuard redirige vers /auth (non authentifié)
  3. Utilisateur bascule en mode inscription
  4. Saisit email, username, password
  5. Clique sur "Vérifier" pour le username
  6. Sélectionne un avatar (optionnel)
  7. Soumet le formulaire
  8. Compte créé, connexion automatique
  9. Redirection vers /home

Cas 2: Connexion Régulière

  1. Utilisateur accède à /auth
  2. Saisit username et password
  3. Soumet le formulaire
  4. Authentification réussie
  5. Redirection vers /home

Cas 3: Compte Déjà Connecté

  1. Utilisateur se connecte
  2. Serveur détecte une session active
  3. Retourne erreur 409 ALREADY_CONNECTED
  4. Popup affichée avec message explicite
  5. Déconnexion Firebase forcée
  6. Utilisateur reste sur /auth

Cas 4: Username Déjà Pris

  1. Utilisateur en mode inscription
  2. Saisit un username existant
  3. Clique sur "Vérifier"
  4. Serveur retourne { available: false }
  5. Message d'erreur affiché
  6. Bouton de soumission désactivé
  7. Utilisateur modifie le username
  8. Doit re-vérifier la disponibilité

Intégration avec Firebase

Configuration Firebase

Fichier: client/src/environments/environment.ts

export const environment = {
  firebaseConfig: {
    apiKey: "...",
    authDomain: "...",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "...",
    appId: "..."
  }
};

Méthodes Firebase Utilisées

Inscription:

createUserWithEmailAndPassword(auth, email, password)

Connexion:

signInWithEmailAndPassword(auth, email, password)

Récupération Token:

await user.getIdToken()

Déconnexion:

signOut(auth)

Intégration Serveur

Endpoints Utilisés

POST /auth/register

POST /auth/login-username

POST /auth/login

GET /auth/check-username/:username

AuthenticateSocket

Points d'Attention

Sécurité

Performance

Expérience Utilisateur

Limitations

Améliorations Futures