Aller au contenu principal

Système d'Authentification et Comptes Clients

Ce document décrit le système d'authentification de l'application e-commerce, incluant l'inscription, la connexion, la gestion du profil utilisateur et l'intégration avec le système de fidélité.

Vue d'ensemble

Le système d'authentification gère l'ensemble du cycle de vie des comptes clients :

  1. Inscription avec création de compte fidélité
  2. Connexion avec génération de token JWT
  3. Synchronisation automatique avec l'API Fidélité
  4. Gestion du profil utilisateur (coordonnées, points, niveau)
  5. Autocomplete d'adresse via l'API gouvernementale française

Composants impliqués

  • Frontend :
    • AuthContext.tsx : Contexte React pour l'authentification
    • AuthPage.tsx : Page d'inscription et connexion
    • AddressAutocomplete.tsx : Composant de recherche d'adresse
    • AccountPage.tsx : Page de profil utilisateur
  • Backend :
    • auth.service.ts : Logique d'authentification et synchronisation
    • auth.controller.ts : Endpoints REST
    • fidelite.service.ts : Intégration avec l'API Fidélité
  • Base de données : Table users avec synchronisation fidélité

Endpoints API

Inscription d'un nouveau client

POST /api/auth/register

Crée un nouveau compte client et génère automatiquement un compte fidélité associé.

Body :

{
"email": "jean.dupont@example.com",
"motDePasse": "motdepasse123",
"prenom": "Jean",
"nom": "Dupont",
"telephone": "0612345678",
"adresse": "123 Rue de la Paix, 75001 Paris"
}

Champs :

  • email (requis) : Email unique du client
  • motDePasse (requis) : Mot de passe (min. 6 caractères)
  • prenom (requis) : Prénom du client
  • nom (requis) : Nom du client
  • telephone (optionnel) : Numéro de téléphone
  • adresse (optionnel) : Adresse complète

Réponse :

{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 42,
"email": "jean.dupont@example.com",
"prenom": "Jean",
"nom": "Dupont",
"clientId": "CLI_A3B5C7D9",
"pointsFidelite": 0,
"niveauFidelisation": "Standard",
"telephone": "0612345678",
"adresse": "123 Rue de la Paix, 75001 Paris"
}

Format du clientId : CLI_XXXXXXXX où X est un caractère hexadécimal (8 caractères).

Codes de réponse :

  • 201 Created : Compte créé avec succès
  • 409 Conflict : Email déjà utilisé
  • 400 Bad Request : Données invalides

Connexion

POST /api/auth/login

Authentifie un client existant et retourne un token d'accès.

Body :

{
"email": "jean.dupont@example.com",
"motDePasse": "motdepasse123"
}

Réponse :

{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 42,
"email": "jean.dupont@example.com",
"prenom": "Jean",
"nom": "Dupont",
"clientId": "CLI_A3B5C7D9",
"pointsFidelite": 150,
"niveauFidelisation": "Bronze",
"telephone": "0612345678",
"adresse": "123 Rue de la Paix, 75001 Paris"
}

Codes de réponse :

  • 200 OK : Connexion réussie
  • 401 Unauthorized : Email ou mot de passe incorrect

Récupérer le profil utilisateur

GET /api/auth/me

Récupère le profil complet de l'utilisateur connecté avec synchronisation automatique des données fidélité.

Headers :

Authorization: Bearer <accessToken>

Réponse :

{
"id": 42,
"email": "jean.dupont@example.com",
"prenom": "Jean",
"nom": "Dupont",
"clientId": "CLI_A3B5C7D9",
"pointsFidelite": 150,
"niveauFidelisation": "Bronze",
"telephone": "0612345678",
"adresse": "123 Rue de la Paix, 75001 Paris",
"createdAt": "2024-11-13T10:30:00Z",
"updatedAt": "2024-11-13T15:45:00Z",
"derniereSynchro": "2024-11-13T15:45:00Z"
}
Synchronisation automatique

À chaque appel de /api/auth/me, le système synchronise automatiquement les points de fidélité et le niveau de fidélisation depuis l'API Fidélité. Les coordonnées (téléphone, adresse) ne sont jamais écrasées lors de la synchronisation.

Codes de réponse :

  • 200 OK : Profil retourné
  • 401 Unauthorized : Token invalide ou expiré

Déconnexion

POST /api/auth/logout

Révoque le token d'authentification de l'utilisateur.

Headers :

Authorization: Bearer <accessToken>

Réponse :

{
"message": "Déconnexion réussie"
}

Codes de réponse :

  • 200 OK : Déconnexion réussie
  • 401 Unauthorized : Token invalide

Intégration avec le système de Fidélité

Création de compte fidélité

Lors de l'inscription, le système tente automatiquement de créer un compte dans l'API Fidélité :

  1. Recherche : Vérification si un compte existe déjà pour l'email
  2. Création : Si aucun compte n'existe, création avec prenom, nom, email
  3. Fallback : En cas d'échec de l'API Fidélité, génération d'un clientId local

Format du clientId généré :

  • Via API Fidélité : Format fourni par l'API (ex: CLI_12345678)
  • En fallback local : CLI_XXXXXXXX (8 caractères hexadécimaux aléatoires)

Synchronisation des données

Le système synchronise uniquement les données suivantes depuis l'API Fidélité :

  • ✅ Points de fidélité (pointsFidelite)
  • ✅ Niveau de fidélisation (niveauFidelisation)
  • ✅ Prénom et nom (si modifiés dans Fidélité)

Données NON synchronisées :

  • ❌ Téléphone (géré uniquement par le formulaire d'inscription)
  • ❌ Adresse (gérée uniquement par le formulaire d'inscription)
Gestion des coordonnées

Les coordonnées de contact (téléphone et adresse) sont exclusivement gérées par l'application e-commerce et ne sont jamais écrasées par les données de l'API Fidélité, car celle-ci ne les gère pas de manière fiable.

Fonctionnalités Frontend

Autocomplete d'adresse

Le composant AddressAutocomplete permet une saisie facilitée de l'adresse en utilisant l'API gouvernementale française.

API utilisée : https://api-adresse.data.gouv.fr/search/

Fonctionnement :

  1. L'utilisateur tape une adresse (ex: "123 rue de la paix paris")
  2. Après 300ms de pause (debounce), une requête est envoyée à l'API
  3. Les suggestions apparaissent sous forme de liste déroulante
  4. Au clic sur une suggestion, les champs sont pré-remplis

Données extraites :

  • rue : Numéro et nom de la rue (ex: "123 Rue de la Paix")
  • codePostal : Code postal (ex: "75001")
  • ville : Nom de la ville (ex: "Paris")

Adresse finale : Concaténation au format {rue}, {codePostal} {ville}

Pré-remplissage au Checkout

Lorsqu'un utilisateur connecté accède à la page de paiement (/checkout), ses coordonnées sont automatiquement pré-remplies :

  • Prénom et nom
  • Email
  • Téléphone (si renseigné)
  • Adresse parsée en rue, code postal et ville (si renseignée)

Parsing de l'adresse : Le système utilise une expression régulière pour extraire le code postal de l'adresse complète :

const codePostalMatch = adresse.match(/\b(\d{5})\b/);

Gestion des tokens

Génération

Les tokens JWT sont générés avec les informations suivantes :

  • userId : ID de l'utilisateur
  • email : Email de l'utilisateur
  • Durée de validité : 7 jours

Stockage

  • Backend : Table auth_tokens avec date d'expiration
  • Frontend : localStorage via le contexte React

Validation

À chaque requête protégée, le AuthGuard vérifie :

  1. Présence du token dans l'en-tête Authorization: Bearer <token>
  2. Existence du token en base de données
  3. Date d'expiration non dépassée
  4. Existence de l'utilisateur associé

Révocation

Lors de la déconnexion, le token est supprimé de la base de données et du localStorage.

Schéma de la table users

CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
mot_de_passe_hash VARCHAR(255),
prenom VARCHAR(100),
nom VARCHAR(100),
telephone VARCHAR(50),
adresse TEXT,
client_id VARCHAR(50) UNIQUE,
points_fidelite INTEGER DEFAULT 0,
niveau_fidelisation VARCHAR(50) DEFAULT 'Standard',
derniere_synchro TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);

Champs clés :

  • client_id : Identifiant unique du compte fidélité (format CLI_XXXXXXXX)
  • points_fidelite : Points de fidélité synchronisés depuis l'API
  • niveau_fidelisation : Niveau de fidélité (Standard, Bronze, Silver, Gold, etc.)
  • derniere_synchro : Date de la dernière synchronisation avec l'API Fidélité

Flux d'inscription

Flux de connexion

Bonnes pratiques d'intégration

Pour les équipes frontend

  1. Toujours utiliser le contexte AuthContext pour accéder aux données utilisateur
  2. Vérifier isAuthenticated avant d'afficher du contenu protégé
  3. Gérer les erreurs 401 en redirigeant vers la page de connexion
  4. Utiliser le composant AddressAutocomplete pour toute saisie d'adresse
  5. Ne pas stocker de données sensibles dans le localStorage (le token suffit)

Pour les équipes backend

  1. Utiliser le AuthGuard sur tous les endpoints nécessitant une authentification
  2. Accéder à l'utilisateur via req.user dans les contrôleurs protégés
  3. Ne jamais écraser telephone/adresse lors des synchronisations Fidélité
  4. Logger les tentatives de connexion pour le monitoring de sécurité
  5. Gérer gracieusement les échecs de l'API Fidélité (fallback sur clientId local)

Pour l'équipe Fidélité

Ce que vous devez fournir :

  • Endpoint de recherche client par email : GET /api/publique/clients?email={email}
  • Endpoint de création client : POST /api/publique/clients
  • Endpoint de récupération client : GET /api/publique/clients/{clientId}
  • Format de clientId cohérent (recommandé : CLI_XXXXXXXX)

Ce que nous synchronisons depuis votre API :

  • Points de fidélité (pointsFidelite)
  • Niveau de fidélisation (niveauFidelisation)
  • Prénom et nom (en cas de mise à jour)

Ce que nous ne synchronisons PAS :

  • Téléphone (géré par notre formulaire d'inscription)
  • Adresse (gérée par notre formulaire d'inscription)

Surveillance et logs

Logs disponibles

Le système génère des logs détaillés pour chaque opération :

Inscription :

[AuthService] 🔍 SERVICE - Données destructurées:
- telephoneInput: "0612345678" (type: string)
- adresseInput: "123 Rue de la Paix, 75001 Paris" (type: string)
[AuthService] Tentative d'inscription pour email: jean.dupont@example.com
[FideliteService] ❌ Client jean.dupont@example.com non trouvé dans Fidélité
[FideliteService] Création du client dans l'API Fidélité...
[AuthService] ✅ Synchronisation Fidélité réussie:
- ClientID: CLI_A3B5C7D9
[AuthService] ✨ Nouveau compte créé avec succès: jean.dupont@example.com (ID: 42)

Connexion :

[AuthService] Tentative de connexion pour email: jean.dupont@example.com
[AuthService] ✅ Connexion réussie pour: jean.dupont@example.com (ID: 42)

Synchronisation :

[AuthService] 🔄 Synchronisation du profil utilisateur 42...
[FideliteService] 🔍 Récupération du client CLI_A3B5C7D9
[AuthService] ✅ Profil utilisateur 42 synchronisé avec succès
- Points: 150
- Niveau: Bronze

Métriques à surveiller

  • Taux de succès des inscriptions
  • Taux d'échec de l'API Fidélité (pour activer le fallback local)
  • Durée de synchronisation des profils
  • Nombre de tokens expirés/révoqués

Liens utiles