Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Authentication Service (auth-service) - System Design Document

0. Sommaire

1. Introduction

1.1 Objectif du Document

Ce document décrit l’architecture et la conception technique du service d’authentification (auth-service) de l’application Whispr. Il sert de référence pour l’équipe de développement et les parties prenantes du projet.

1.2 Périmètre du Service

Le service auth est responsable de toutes les fonctionnalités liées à l’authentification des utilisateurs, à la gestion des appareils multi-device, à l’authentification à deux facteurs, et à la gestion des clés de chiffrement pour le protocole Signal (E2E).

1.3 Relations avec les Autres Services

Ce service est fondamental dans l’architecture Whispr car il fournit l’authentification et l’autorisation pour tous les autres microservices.

Il communique principalement avec:

  • user-service: pour la gestion des profils utilisateurs (via gRPC over mTLS)
  • notification-service: pour l’envoi des notifications push et gestion des appareils (via gRPC over mTLS)
  • Service SMS externe: pour l’envoi des codes de vérification (Twilio, Vonage, etc.)
  • Tous les autres services via l’API Gateway pour la validation des tokens

2. Architecture Globale

2.1 Vue d’Ensemble de l’Architecture avec Istio Service Mesh

Le service d’authentification fonctionne dans un service mesh Istio qui sécurise automatiquement toutes les communications inter-services :

graph TD
    A[API Gateway + Istio Ingress] --> B[Auth Service Pod]
    
    subgraph "Kubernetes Cluster avec Istio Service Mesh"
        subgraph "auth-service Pod"
            B1[Auth Container] 
            B2[Envoy Sidecar]
        end
        
        subgraph "user-service Pod"
            C1[User Container]
            C2[Envoy Sidecar]
        end
        
        subgraph "notification-service Pod"
            D1[Notification Container]
            D2[Envoy Sidecar]
        end
        
        B2 -.->|mTLS gRPC| C2
        B2 -.->|mTLS gRPC| D2
    end
    
    B --> E[(PostgreSQL Auth DB)]
    B --> F[(Redis Cache)]
    B --> G[Service SMS Externe]
    
    subgraph "Istio Control Plane"
        H[Istiod]
        I[Certificate Authority]
    end
    
    subgraph "Auth Service Container"
        J[API Layer] --> K[Service Layer]
        K --> L[Repository Layer]
        K --> M[Security Layer]
        M --> N[Encryption Module]
        M --> O[JWT Token Manager]
        M --> P[Device Registry]
    end
    
    H -.->|Manage| B2
    H -.->|Manage| C2
    H -.->|Manage| D2
    I -.->|Auto TLS Certs| B2
    
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style B2 fill:#e1f5fe,stroke:#0277bd,stroke-width:2px
    style C2 fill:#e1f5fe,stroke:#0277bd,stroke-width:2px
    style D2 fill:#e1f5fe,stroke:#0277bd,stroke-width:2px

2.2 Principes Architecturaux

  • Stateless: Le service opère sans état pour faciliter le scaling horizontal
  • JWT-Based Authentication: Utilisation exclusive de JSON Web Tokens pour l’authentification
  • Zero Trust Network: Toutes les communications inter-services sont chiffrées et authentifiées via mTLS automatique
  • Service Mesh Security: Sécurité implémentée au niveau infrastructure via Istio
  • Device-Centric: Gestion des appareils multiples sans état serveur centralisé
  • Sécurité par Design: Implémentation des meilleures pratiques de sécurité à chaque niveau
  • Résilience: Gestion des défaillances avec graceful degradation via Istio
  • Observabilité: Logging structuré, métriques détaillées et tracing distribué via Istio

3. Choix Technologiques

3.1 Stack Technique

  • Langage: TypeScript
  • Framework: NestJS (framework Node.js)
  • Authentication: JWT stateless uniquement (RFC 7519)
  • Service Mesh: Istio pour la sécurité et l’observabilité des communications inter-services
  • Proxy Sidecar: Envoy (injecté automatiquement par Istio)
  • Sécurité Inter-Services: mTLS automatique via Istio avec rotation de certificats
  • Base de données: PostgreSQL pour les données persistantes d’authentification
  • Stockage temporaire: Redis pour les données temporaires (codes de vérification, challenges, device registry)
  • Communication inter-services: gRPC over mTLS automatique via Istio Service Mesh
  • ORM: TypeORM pour PostgreSQL
  • Authentification: JWT pour les tokens, bcrypt pour le hachage des secrets
  • Chiffrement: librairies Signal Protocol officielles
  • API: REST avec OpenAPI/Swagger (via décorateurs NestJS)
  • Cache: Redis (via @nestjs/cache-manager)
  • Service SMS: Intégration avec un service SMS externe (Twilio, Vonage, etc.)

3.2 Infrastructure

  • Containerisation: Docker
  • Orchestration: Kubernetes (GKE)
  • Service Mesh: Istio avec injection automatique de sidecars Envoy
  • Security: mTLS automatique, AuthorizationPolicies et NetworkPolicies Istio
  • CI/CD: GitHub Actions
  • Service Cloud: Google Cloud Platform (GCP)
  • Monitoring: Prometheus + Grafana + Kiali (Istio service topology)
  • Logging: Loki + accès logs Envoy
  • Tracing: Jaeger (intégré avec Istio pour le tracing distribué)
  • Certificate Management: Istio CA pour la rotation automatique des certificats mTLS

4. Composants Principaux

4.1 Structure NestJS

L’architecture NestJS du service est organisée comme suit:

src/
├── main.ts                    # Point d'entrée de l'application
├── app.module.ts              # Module racine
├── modules/                   # Modules fonctionnels
│   ├── auth/                  # Module d'authentification JWT
│   ├── verification/          # Module de vérification SMS
│   ├── twoFactor/             # Module 2FA
│   ├── keyManagement/         # Module de gestion des clés Signal
│   └── deviceRegistry/        # Module de gestion des appareils
├── shared/                    # Code partagé entre modules
│   ├── guards/                # Guards d'authentification JWT
│   ├── interceptors/          # Interceptors (logging, transformation)
│   ├── pipes/                 # Pipes de validation
│   ├── filters/               # Filtres d'exception
│   └── decorators/            # Décorateurs personnalisés
└── config/                    # Configuration de l'application

4.2 Controllers (API Layer)

Les Controllers NestJS exposent les endpoints RESTful:

  • AuthController: endpoints d’enregistrement, login JWT et refresh tokens
  • VerificationController: endpoints de vérification par SMS
  • TwoFactorController: endpoints de gestion 2FA
  • KeyController: endpoints de gestion des clés Signal
  • DeviceController: endpoints de gestion des appareils multi-device

Avantages:

  • Décorateurs pour définir les routes, méthodes HTTP et validation
  • Génération automatique de la documentation Swagger via @nestjs/swagger
  • Gestion des réponses HTTP standardisée

4.3 Services (Business Logic Layer)

Providers NestJS contenant la logique métier:

  • AuthService: gestion des processus d’authentification JWT
  • JwtTokenService: génération et validation des tokens JWT
  • VerificationService: vérification par SMS
  • TwoFactorService: gestion de l’authentification à deux facteurs
  • KeyManagementService: gestion des clés pour le protocole Signal
  • DeviceRegistryService: gestion du registre des appareils multi-device

Avantages:

  • Injection de dépendances automatique
  • Testabilité améliorée (facilité de mock)
  • Séparation claire des responsabilités

4.4 Repositories (Data Access Layer)

Gère les accès aux données via TypeORM:

  • UserAuthRepository: opérations liées aux utilisateurs d’authentification
  • KeyRepository: opérations liées aux clés cryptographiques
  • VerificationRepository: gestion des codes de vérification temporaires
  • LoginHistoryRepository: historique des connexions pour audit

4.5 Guards et Interceptors (Security Layer)

Centralise les fonctionnalités de sécurité:

  • JwtAuthGuard: validation des tokens JWT (stateless)
  • RateLimitInterceptor: protection contre les attaques par force brute
  • TwoFactorGuard: vérification de l’authentification à deux facteurs
  • DeviceValidationGuard: validation des appareils multi-device
  • EncryptionService: gestion du chiffrement Signal

4.6 Communication avec les autres services via Istio Service Mesh

  • @nestjs/microservices: pour l’intégration gRPC avec les autres services
  • mTLS automatique: Toutes les communications gRPC sont automatiquement sécurisées par Istio
  • Service Discovery: Résolution automatique des services via Istio et Kubernetes DNS
  • Load Balancing: Répartition de charge automatique par Envoy proxies
  • Création d’interfaces gRPC pour les communications inter-services:
    • Interface UserService: récupération de profils, création d’utilisateurs
    • Interface NotificationService: envoi de notifications push, gestion des appareils

4.6.1 Configuration Istio pour auth-service

# AuthorizationPolicy pour permettre à auth-service d'appeler user-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-to-user-service
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: user-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/auth-service"]
  - to:
    - operation:
        methods: ["POST", "GET", "PUT"]
        paths: ["/user.UserService/*"]

4.7 Configuration et Modules

  • ConfigModule (@nestjs/config): gestion des variables d’environnement
  • CacheModule: intégration Redis pour le cache et les données temporaires
  • ThrottlerModule: limitation de débit intégrée (complétée par Istio rate limiting)
  • JwtModule: gestion des tokens JWT (STATELESS)
  • GrpcModule: communication avec les autres microservices via Istio mTLS
  • HealthModule (@nestjs/terminus): health checks pour Kubernetes et Istio

5. Scaling et Performances

5.1 Stratégie de Scaling

  • Horizontal Pod Autoscaling (HPA): Scaling automatique basé sur CPU/mémoire et métriques personnalisées
  • Istio Load Balancing: Répartition intelligente de charge avec plusieurs algorithmes (round-robin, least request, etc.)
  • Circuit Breakers: Protection automatique contre les cascades de pannes via Istio
  • Répliques multiples: Instances complètement stateless facilitant le scaling illimité
  • Health Checks: Intégration avec les probes Kubernetes et Istio

5.2 Cache et Optimisations

  • JWT Validation Caching: Mise en cache des clés publiques de validation
  • Device Registry Cache: Cache Redis des informations d’appareils actifs
  • Refresh Token Metadata: Métadonnées en cache pour éviter les lookups DB
  • Connection Pooling: Gestion optimisée des connexions via Envoy
  • Request Routing: Routage intelligent des requêtes via Istio
  • Optimisation des requêtes de base de données (indices appropriés)

5.3 Limites et Quotas avec Istio

  • Rate Limiting Istio: Limitation de débit au niveau du service mesh
  • Per-User Rate Limiting: Quotas personnalisés par utilisateur
  • Circuit Breaker Istio: Protection automatique contre la surcharge
  • Quotas sur les opérations sensibles (création de comptes, vérifications SMS)
  • Timeout appropriés configurés via Istio VirtualService

6. Monitoring et Observabilité

6.1 Observabilité Istio

  • Kiali: Visualisation de la topologie du service mesh et health des services
  • Jaeger: Tracing distribué automatique de toutes les requêtes inter-services
  • Prometheus: Collecte automatique des métriques Istio et custom metrics
  • Grafana: Dashboards pour les métriques système et business
  • Envoy Access Logs: Logs détaillés de toutes les communications

6.2 Logging

  • Logs structurés en JSON via @nestjs/common Logger
  • Envoy Access Logs: Logs automatiques de toutes les requêtes HTTP/gRPC
  • Distributed Tracing: Corrélation automatique des logs via trace ID
  • Utilisation du LoggingInterceptor NestJS pour le logging automatique des requêtes
  • Niveaux de log différenciés (INFO, WARN, ERROR, DEBUG)
  • Contexte inclus (userId, requestId, traceId, deviceId, etc.)
  • Sensibilité aux données personnelles (masquage)

6.3 Métriques

  • Métriques Istio automatiques:
    • Latence des requêtes inter-services
    • Taux de succès/erreur par service
    • Throughput des communications
    • Métriques de sécurité mTLS
  • Métriques métier personnalisées:
    • Taux de réussite/échec des authentifications JWT
    • Nombre de tokens générés/validés par minute
    • Taux d’utilisation du device registry
    • Métriques de refresh token rotation

6.4 Alerting

  • Alertes Istio:
    • Dégradation de la connectivité inter-services
    • Échecs de certificats mTLS
    • Latence élevée dans le service mesh
  • Alertes business:
    • Taux d’échec anormal des validations JWT
    • Tentatives suspectes de refresh token
    • Épuisement des ressources

7. Gestion des Erreurs et Résilience

7.1 Stratégie de Gestion des Erreurs

  • Utilisation des ExceptionFilters NestJS pour gérer les erreurs de manière centralisée
  • Codes d’erreur standardisés via HttpException et dérivés personnalisés
  • Messages d’erreur clairs mais sans divulgation d’informations sensibles
  • Logging détaillé des erreurs pour le débogage
  • Correlation avec Istio tracing: Chaque erreur est tracée dans Jaeger
  • Possibilité d’enrichir les exceptions via les interceptors NestJS

7.2 Résilience avec Istio

  • Circuit Breakers Istio: Protection automatique contre les services défaillants
  • Retry Policies: Retries automatiques configurables via Istio VirtualService
  • Timeout Management: Timeouts granulaires par service et opération
  • Outlier Detection: Détection automatique et éviction des instances défaillantes
  • Traffic Shifting: Basculement de trafic en cas de problème (blue/green, canary)
  • Fault Injection: Tests de chaos intégrés pour validation de la résilience

7.3 Plan de Reprise d’Activité

  • RPO (Recovery Point Objective): 1 heure max
  • RTO (Recovery Time Objective): 2 heures max
  • Multi-AZ Deployment: Déploiement dans plusieurs zones de disponibilité
  • Istio Multi-Cluster: Préparation pour le déploiement multi-cluster si nécessaire
  • Sauvegardes régulières de la base de données
  • Procédures de restauration documentées

8. Évolution et Maintenance

8.1 Versionnement

  • Versionnement sémantique des API
  • Traffic Routing Istio: Déploiement progressif de nouvelles versions via traffic splitting
  • Canary Deployments: Tests de nouvelles versions sur un pourcentage de trafic
  • Rétrocompatibilité maintenue pour les clients existants
  • Période de dépréciation avant suppression de fonctionnalités

8.2 Mise à Jour et Déploiement

  • GitOps avec ArgoCD
  • Istio Rolling Updates: Déploiement sans interruption via Istio
  • Blue/Green avec Istio: Basculement de trafic instantané entre versions
  • Tests automatisés avant déploiement
  • Rollback automatique en cas d’échec via Istio traffic management
  • Fenêtres de maintenance planifiées (si nécessaire)

8.3 Documentation Technique

  • Documentation OpenAPI générée automatiquement via @nestjs/swagger et décorateurs
  • Documentation Istio: Configurations des policies de sécurité et traffic management
  • Exemples de code pour l’intégration
  • Flux documentés pour les opérations complexes
  • Guide de dépannage pour les problèmes courants
  • Documentation automatique des DTO et entités via décorateurs Swagger

9. Considérations Opérationnelles

9.1 DevOps

  • Pipeline CI/CD via GitHub Actions
  • Tests d’intégration Istio: Validation des configurations service mesh
  • Security Scanning: Analyse des configurations Istio pour les vulnérabilités
  • Intégration continue avec tests automatisés
  • Déploiement continu en environnement de développement et staging via ArgoCD

9.2 Environnements

  • Namespaces Kubernetes: Isolation par environnement (dev, staging, prod)
  • Istio Traffic Management: Routage par environnement
  • mTLS par environnement: Certificats séparés par namespace
  • Isolation complète des données entre environnements
  • Parité des configurations Istio entre environnements

9.3 Support

  • Distributed Tracing: Debugging facile via Jaeger
  • Service Topology: Visualisation des dépendances via Kiali
  • Logs centralisés pour le diagnostic
  • Istio Troubleshooting: Outils intégrés pour diagnostiquer les problèmes de connectivité
  • Procédures documentées pour les problèmes courants

Appendices

A. Métriques de Performance Cibles

MétriqueCibleMonitoring
Temps de réponse moyen< 200msPrometheus + Grafana
99e percentile temps de réponse< 1sIstio + Jaeger
Taux d’erreur< 0.1%Kiali + Prometheus
Disponibilité> 99%Istio Health Checks
Temps moyen de vérification SMS< 10sCustom metrics
mTLS Success Rate> 99.9%Istio metrics
Inter-service latency< 50msEnvoy metrics
Certificate rotationAutomatiqueIstio CA
JWT Validation latency< 50msCustom metrics
Device Registry lookup< 20msRedis metrics

B. Estimation des Ressources

RessourceEstimation InitialeIstio Overhead
Instances de service3 replicas+ Envoy sidecars
CPU par instance1 vCPU+ 0.1 vCPU (Envoy)
Mémoire par instance2 GB RAM+ 200MB (Envoy)
Stockage PostgreSQL20 GB initial-
Stockage Redis2 GB-
Bandwidth mensuel50 GB+ mTLS overhead (~5%)
Istio Control Plane-1 vCPU, 1GB RAM

C. Configuration Istio Examples

C.1 PeerAuthentication (mTLS Strict)

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: whispr
spec:
  mtls:
    mode: STRICT

C.2 AuthorizationPolicy pour auth-service

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-service-policy
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: auth-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/api-gateway"]
  - to:
    - operation:
        methods: ["POST", "GET", "PUT", "DELETE"]

C.3 DestinationRule avec Circuit Breaker

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: auth-service-circuit-breaker
  namespace: whispr
spec:
  host: auth-service
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 3
      interval: 30s
      baseEjectionTime: 30s
    circuitBreaker:
      maxConnections: 100
      maxRequestsPerConnection: 10
      maxRetries: 3

D. Références

Conception de la Base de Données - Service d’Authentification

Sommaire

1. Introduction et Principes de Conception

1.1 Objectif

Ce document décrit la structure de la base de données du service d’authentification (auth-service) de l’application Whispr, en détaillant les modèles de données, les relations, et les considérations de performance.

1.2 Principes Architecturaux

  • Séparation des domaines: Chaque service gère ses propres données dans sa propre base de données
  • Dénormalisation contrôlée: Duplication minimale des données nécessaires à l’autonomie du service
  • Haute performance: Optimisation pour les opérations d’authentification fréquentes
  • Sécurité par conception: Attention particulière au stockage sécurisé des données sensibles

1.3 Technologie

  • PostgreSQL: Pour les données persistantes d’authentification
  • Redis: Pour les données temporaires (codes de vérification, sessions, challenges)

2. Schéma PostgreSQL du Service d’Authentification

2.1 Vue d’Ensemble

erDiagram
    USERS_AUTH ||--o{ DEVICES : "possède"
    USERS_AUTH ||--o{ PREKEYS : "possède"
    USERS_AUTH ||--o{ SIGNED_PREKEYS : "possède"
    USERS_AUTH ||--o{ IDENTITY_KEYS : "possède"
    USERS_AUTH ||--o{ BACKUP_CODES : "possède"
    USERS_AUTH ||--o{ LOGIN_HISTORY : "possède"
    DEVICES ||--o{ LOGIN_HISTORY : "utilisé lors de"
    
    USERS_AUTH {
        uuid id PK
        string phoneNumber UK
        string twoFactorSecret
        boolean twoFactorEnabled
        timestamp lastAuthenticatedAt
        timestamp createdAt
        timestamp updatedAt
    }
    
    DEVICES {
        uuid id PK
        uuid userId FK
        string deviceName
        string deviceType
        string deviceFingerprint UK
        string model
        string osVersion
        string appVersion
        string fcmToken
        string apnsToken
        text publicKey
        timestamp lastActive
        string ipAddress
        boolean isVerified
        boolean isActive
        timestamp createdAt
        timestamp updatedAt
    }
    
    PREKEYS {
        uuid id PK
        uuid userId FK
        int keyId
        string publicKey
        boolean isOneTime
        boolean isUsed
        timestamp createdAt
    }
    
    SIGNED_PREKEYS {
        uuid id PK
        uuid userId FK
        int keyId
        string publicKey
        string signature
        timestamp createdAt
        timestamp expiresAt
    }
    
    IDENTITY_KEYS {
        uuid id PK
        uuid userId FK
        string publicKey
        string privateKeyEncrypted
        timestamp createdAt
        timestamp updatedAt
    }
    
    BACKUP_CODES {
        uuid id PK
        uuid userId FK
        string codeHash
        boolean used
        timestamp createdAt
        timestamp usedAt
    }
    
    LOGIN_HISTORY {
        uuid id PK
        uuid userId FK
        uuid deviceId FK
        string ipAddress
        string userAgent
        timestamp createdAt
        string status
    }

2.2 Description des Tables

2.2.1 USERS_AUTH

Stocke les informations minimales nécessaires pour l’authentification des utilisateurs.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de l’utilisateurPK, NOT NULL
phoneNumberVARCHAR(20)Numéro de téléphone au format E.164UNIQUE, NOT NULL
twoFactorSecretVARCHAR(255)Secret TOTP pour l’authentification à deux facteursENCRYPTED, NULL
twoFactorEnabledBOOLEANIndique si l’authentification à deux facteurs est activéeNOT NULL, DEFAULT FALSE
lastAuthenticatedAtTIMESTAMPDate/heure de la dernière authentification réussieNULL
createdAtTIMESTAMPDate/heure de création du compteNOT NULL
updatedAtTIMESTAMPDate/heure de la dernière mise à jourNOT NULL

Indices:

  • PRIMARY KEY sur id
  • UNIQUE sur phoneNumber
  • INDEX sur phoneNumber pour les recherches fréquentes

2.2.2 DEVICES

Stocke les informations sur les appareils associés à un compte utilisateur.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de l’appareilPK, NOT NULL
userIdUUIDRéférence à l’utilisateur propriétaireFK (USERS_AUTH.id), NOT NULL
deviceNameVARCHAR(100)Nom de l’appareilNOT NULL
deviceTypeVARCHAR(20)Type d’appareil (iOS, Android, Web)NOT NULL
deviceFingerprintVARCHAR(255)Empreinte unique de l’appareilUNIQUE, NOT NULL
modelVARCHAR(100)Modèle de l’appareilNULL
osVersionVARCHAR(50)Version du système d’exploitationNULL
appVersionVARCHAR(20)Version de l’applicationNULL
fcmTokenVARCHAR(255)Token pour les notifications push AndroidNULL
apnsTokenVARCHAR(255)Token pour les notifications push iOSNULL
publicKeyTEXTClé publique de l’appareil pour le chiffrementNOT NULL
lastActiveTIMESTAMPDernière activité de l’appareilNOT NULL
ipAddressVARCHAR(45)Dernière adresse IP connueNULL
isVerifiedBOOLEANIndique si l’appareil a été vérifiéNOT NULL, DEFAULT FALSE
isActiveBOOLEANIndique si l’appareil est actifNOT NULL, DEFAULT TRUE
createdAtTIMESTAMPDate/heure d’ajout de l’appareilNOT NULL
updatedAtTIMESTAMPDate/heure de la dernière mise à jourNOT NULL

Indices:

  • PRIMARY KEY sur id
  • FOREIGN KEY sur userIdusers_auth(id)
  • UNIQUE sur deviceFingerprint
  • INDEX sur userId pour les jointures fréquentes
  • INDEX sur lastActive pour faciliter le nettoyage des appareils inactifs
  • INDEX sur isActive pour filtrer les appareils actifs

2.2.3 PREKEYS

Stocke les clés préalables (pre-keys) pour le protocole Signal.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de la cléPK, NOT NULL
userIdUUIDRéférence à l’utilisateur propriétaireFK (USERS_AUTH.id), NOT NULL
keyIdINTEGERIdentifiant de la clé dans le protocoleNOT NULL
publicKeyTEXTClé publique encodéeNOT NULL
isOneTimeBOOLEANIndique s’il s’agit d’une clé à usage uniqueNOT NULL, DEFAULT TRUE
isUsedBOOLEANIndique si la clé a déjà été utiliséeNOT NULL, DEFAULT FALSE
createdAtTIMESTAMPDate/heure de créationNOT NULL

Indices:

  • PRIMARY KEY sur id
  • UNIQUE sur (userId, keyId) pour éviter les doublons
  • INDEX sur userId pour les recherches

2.2.4 SIGNED_PREKEYS

Stocke les clés préalables signées pour le protocole Signal.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de la cléPK, NOT NULL
userIdUUIDRéférence à l’utilisateur propriétaireFK (USERS_AUTH.id), NOT NULL
keyIdINTEGERIdentifiant de la clé dans le protocoleNOT NULL
publicKeyTEXTClé publique encodéeNOT NULL
signatureTEXTSignature cryptographiqueNOT NULL
createdAtTIMESTAMPDate/heure de créationNOT NULL
expiresAtTIMESTAMPDate/heure d’expirationNOT NULL

Indices:

  • PRIMARY KEY sur id
  • UNIQUE sur (userId, keyId) pour éviter les doublons
  • INDEX sur userId pour les recherches

2.2.5 IDENTITY_KEYS

Stocke les clés d’identité pour le protocole Signal.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de la cléPK, NOT NULL
userIdUUIDRéférence à l’utilisateur propriétaireFK (USERS_AUTH.id), NOT NULL
publicKeyTEXTClé publique encodéeNOT NULL
privateKeyEncryptedTEXTClé privée chiffrée (si nécessaire)ENCRYPTED, NULL
createdAtTIMESTAMPDate/heure de créationNOT NULL
updatedAtTIMESTAMPDate/heure de la dernière mise à jourNOT NULL

Indices:

  • PRIMARY KEY sur id
  • UNIQUE sur userId (un utilisateur a une seule clé d’identité active)

2.2.6 BACKUP_CODES

Stocke les codes de secours pour l’authentification 2FA.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique du codePK, NOT NULL
userIdUUIDRéférence à l’utilisateur propriétaireFK (USERS_AUTH.id), NOT NULL
codeHashVARCHAR(255)Hachage du code de secoursNOT NULL
usedBOOLEANIndique si le code a été utiliséNOT NULL, DEFAULT FALSE
createdAtTIMESTAMPDate/heure de créationNOT NULL
usedAtTIMESTAMPDate/heure d’utilisationNULL

Indices:

  • PRIMARY KEY sur id
  • INDEX sur userId pour les recherches

2.2.7 LOGIN_HISTORY

Enregistre l’historique des connexions.

ColonneTypeDescriptionContraintes
idUUIDIdentifiant unique de l’entréePK, NOT NULL
userIdUUIDRéférence à l’utilisateurFK (USERS_AUTH.id), NOT NULL
deviceIdUUIDRéférence à l’appareil utiliséFK (DEVICES.id), NULL
ipAddressVARCHAR(45)Adresse IP de la connexionNOT NULL
userAgentTEXTUser-agent du clientNULL
createdAtTIMESTAMPDate/heure de la tentativeNOT NULL
statusVARCHAR(20)Statut (success, failed, etc.)NOT NULL

Indices:

  • PRIMARY KEY sur id
  • INDEX sur userId pour les recherches
  • INDEX sur deviceId pour les recherches par appareil
  • INDEX sur createdAt pour les requêtes temporelles

3. Données Temporaires dans Redis

3.1 Vue d’Ensemble

Redis est utilisé pour stocker des données temporaires et à haute disponibilité:

erDiagram
    VERIFICATION_CODES {
        string verificationId PK
        string phoneNumber
        string hashedCode
        string purpose
        int attempts
        timestamp expiresAt
    }
    SESSIONS {
        string sessionId PK
        uuid userId
        uuid deviceId
        timestamp lastActive
        timestamp expiresAt
    }
    QR_LOGIN_CHALLENGES {
        string qrChallengeId PK
        string challenge
        timestamp expiresAt
    }
    RATE_LIMIT_COUNTERS {
        string key PK
        int counter
        timestamp expiresAt
    }

3.2 Description des Structures Redis

3.2.1 VERIFICATION_CODES

Stocke les codes de vérification temporaires envoyés par SMS.

Clé: verification:{verificationId}
Type: Hash
TTL: 15 minutes
Champs:

  • phoneNumber: Numéro de téléphone cible
  • hashedCode: Code de vérification haché
  • purpose: Objectif (registration, login, recovery, phone_change)
  • attempts: Nombre de tentatives effectuées
  • expiresAt: Horodatage d’expiration

3.2.2 SESSIONS

Stocke les informations de session active.

Clé: session:{sessionId}
Type: Hash
TTL: Variable (selon la durée de validité du token)
Champs:

  • userId: ID de l’utilisateur
  • deviceId: ID de l’appareil
  • tokenFamily: Famille de tokens pour le refresh
  • lastActive: Dernière activité
  • expiresAt: Horodatage d’expiration

3.2.3 QR_LOGIN_CHALLENGES

Stocke les challenges pour l’authentification par QR code.

Clé: qr_challenge:{qrChallengeId}
Type: Hash
TTL: 5 minutes
Champs:

  • challenge: Challenge cryptographique
  • expiresAt: Horodatage d’expiration

3.2.4 RATE_LIMIT_COUNTERS

Compteurs pour la limitation de débit.

Clé: rate_limit:{type}:{identifier}
Type: String (counter)
TTL: Variable selon le type de limite
Valeur: Nombre de tentatives

4. Relations avec les Autres Services

4.1 Démarcation des Responsabilités

graph LR
    subgraph "auth-service (PostgreSQL)"
        A[USERS_AUTH] --> B[DEVICES]
        A --> C[Clés E2E]
        A --> D[2FA & Sécurité]
        A --> E[LOGIN_HISTORY]
    end
    
    subgraph "user-service (PostgreSQL)"
        F[USERS] --> G[Profil]
        F --> H[Préférences]
        F --> I[Relations sociales]
    end
    
    subgraph "notification-service (PostgreSQL)"
        J[NOTIFICATION_TOKENS] --> K[Références appareils]
        J --> L[Notification Preferences]
    end
    
    A -.->|Même ID| F
    B -.->|device_id référencé| J
    J -.->|gRPC GetDeviceTokens| B

4.2 Synchronisation des Données

  • ID Utilisateur: Même UUID utilisé dans les deux services (auth et user)
  • Création: Création atomique dans auth-service suivi d’un événement pour user-service
  • Gestion des appareils: auth-service est la source de vérité pour tous les appareils
  • Tokens de notification: notification-service maintient une table légère avec les tokens FCM/APNS
  • Synchronisation: notification-service fait des appels gRPC vers auth-service pour obtenir les informations d’appareils

5. Considérations de Sécurité

5.1 Chiffrement des Données Sensibles

  • Niveau Colonne: Les colonnes contenant des informations sensibles (twoFactorSecret, privateKeyEncrypted) sont chiffrées au repos
  • Méthode: Chiffrement AES-256-GCM avec rotation des clés

5.2 Hachage des Secrets

  • Les codes de vérification sont stockés sous forme hachée (bcrypt ou PBKDF2)
  • Les codes de secours sont également hachés avec sel unique

5.3 Audit et Logging

  • Toutes les opérations sensibles sont enregistrées dans la table LOGIN_HISTORY
  • Timestamps d’audit sur toutes les tables (createdAt, updatedAt)

6. Considérations de Performance

6.1 Indexation

  • Index sur les colonnes fréquemment recherchées (phoneNumber, userId, etc.)
  • Index composites pour les requêtes courantes

6.2 Partitionnement

  • La table LOGIN_HISTORY peut être partitionnée par plage de dates pour les performances à long terme

6.3 Optimisations Redis

  • TTL appropriés pour éviter la croissance excessive
  • Utilisation de Redis Cluster pour la haute disponibilité (optionnel)

7. Migrations et Évolution du Schéma

7.1 Stratégie de Migration

  • Migrations progressives avec versionnement
  • Support pour la compatibilité descendante
  • Tests automatisés des migrations

8. Scripts SQL d’Initialisation

8.1 Création du Schéma PostgreSQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- Table des utilisateurs pour l'authentification
CREATE TABLE users_auth (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    phone_number VARCHAR(20) NOT NULL UNIQUE,
    two_factor_secret VARCHAR(255),
    two_factor_enabled BOOLEAN NOT NULL DEFAULT FALSE,
    last_authenticated_at TIMESTAMP,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- Table des appareils (source de vérité)
CREATE TABLE devices (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    device_name VARCHAR(100) NOT NULL,
    device_type VARCHAR(20) NOT NULL,
    device_fingerprint VARCHAR(255) UNIQUE NOT NULL,
    model VARCHAR(100),
    os_version VARCHAR(50),
    app_version VARCHAR(20),
    fcm_token VARCHAR(255),
    apns_token VARCHAR(255),
    public_key TEXT NOT NULL,
    last_active TIMESTAMP NOT NULL DEFAULT NOW(),
    ip_address VARCHAR(45),
    is_verified BOOLEAN NOT NULL DEFAULT FALSE,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- Table des prekeys
CREATE TABLE prekeys (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    key_id INTEGER NOT NULL,
    public_key TEXT NOT NULL,
    is_one_time BOOLEAN NOT NULL DEFAULT TRUE,
    is_used BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    UNIQUE(user_id, key_id)
);

-- Table des prekeys signées
CREATE TABLE signed_prekeys (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    key_id INTEGER NOT NULL,
    public_key TEXT NOT NULL,
    signature TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    expires_at TIMESTAMP NOT NULL,
    UNIQUE(user_id, key_id)
);

-- Table des clés d'identité
CREATE TABLE identity_keys (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL UNIQUE REFERENCES users_auth(id) ON DELETE CASCADE,
    public_key TEXT NOT NULL,
    private_key_encrypted TEXT,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

-- Table des codes de secours
CREATE TABLE backup_codes (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    code_hash VARCHAR(255) NOT NULL,
    used BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    used_at TIMESTAMP
);

-- Table de l'historique des connexions
CREATE TABLE login_history (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    device_id UUID REFERENCES devices(id) ON DELETE SET NULL,
    ip_address VARCHAR(45) NOT NULL,
    user_agent TEXT,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    status VARCHAR(20) NOT NULL
);

-- Création des index
CREATE INDEX idx_devices_user_id ON devices(user_id);
CREATE INDEX idx_devices_device_fingerprint ON devices(device_fingerprint);
CREATE INDEX idx_devices_last_active ON devices(last_active);
CREATE INDEX idx_devices_is_active ON devices(is_active);
CREATE INDEX idx_prekeys_user_id ON prekeys(user_id);
CREATE INDEX idx_signed_prekeys_user_id ON signed_prekeys(user_id);
CREATE INDEX idx_backup_codes_user_id ON backup_codes(user_id);
CREATE INDEX idx_login_history_user_id ON login_history(user_id);
CREATE INDEX idx_login_history_device_id ON login_history(device_id);
CREATE INDEX idx_login_history_created_at ON login_history(created_at);

9. Communication Inter-Services avec Istio

9.1 Architecture de Gestion des Appareils

L’auth-service est la source de vérité pour la gestion des appareils, avec une coordination simplifiée via Istio Service Mesh :

graph LR
    subgraph "auth-service"
        A[PostgreSQL Auth] --> B[devices table COMPLÈTE]
        B --> C[Auth Logic]
        C --> D[Envoy Sidecar]
    end
    
    subgraph "notification-service"
        E[Envoy Sidecar] --> F[Notification Logic]
        F --> G[PostgreSQL Notifications]
        G --> H[notification_tokens table]
    end
    
    subgraph "user-service"
        I[Envoy Sidecar] --> J[User Logic]
        J --> K[PostgreSQL Users]
    end
    
    E -.->|"GetDeviceTokens<br/>mTLS gRPC"| D
    E -.->|"GetUserDevices<br/>mTLS gRPC"| D
    D -.->|"NotifyDeviceEvent<br/>mTLS gRPC"| E
    D -.->|"CreateUser<br/>mTLS gRPC"| I
    
    subgraph "Istio Control Plane"
        L[Certificate Authority]
        M[Service Discovery]
    end
    
    L -.->|Auto Certs| D
    L -.->|Auto Certs| E
    L -.->|Auto Certs| I

9.2 Flux de Données Principal

auth-service comme source de vérité :

  • Gère la table devices complète avec toutes les métadonnées
  • Expose les API CRUD pour la gestion des appareils
  • Coordonne l’authentification et les sessions par appareil
  • Notifie les autres services des événements d’appareils

notification-service en consommateur :

  • Maintient une table notification_tokens légère
  • Fait des appels gRPC vers auth-service pour obtenir les informations d’appareils
  • Se synchronise via des événements envoyés par auth-service

9.3 Communications Sécurisées avec mTLS

9.3.1 notification-service → auth-service (lecture)

# AuthorizationPolicy pour notification-service vers auth-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: notification-to-auth-devices
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: auth-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/notification-service"]
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/auth.AuthService/GetDeviceTokens", "/auth.AuthService/GetUserDevices"]

Patterns de communication :

# notification-service appelle auth-service pour récupérer les tokens
service: auth.AuthService
method: GetDeviceTokens
request: { userId: "uuid", deviceTypes: ["iOS", "Android"] }
response: { devices: [{ deviceId: "uuid", fcmToken: "...", apnsToken: "..." }] }

9.3.2 auth-service → notification-service (événements)

# AuthorizationPolicy pour auth-service vers notification-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-to-notification-events
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: notification-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/auth-service"]
  - to:
    - operation:
        methods: ["POST"]
        paths: ["/notification.NotificationService/NotifyDeviceEvent"]

Événements notifiés :

  • DeviceRegistered : Nouvel appareil enregistré
  • DeviceRevoked : Appareil déconnecté/révoqué
  • DeviceUpdated : Métadonnées d’appareil mises à jour
  • UserAuthenticated : Connexion réussie sur un appareil

9.4 Structure de données notification-service

Pour optimiser les performances, notification-service maintient une table légère :

-- notification-service: table optimisée pour les notifications
CREATE TABLE notification_tokens (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    device_id UUID NOT NULL, -- Référence vers auth-service.devices
    user_id UUID NOT NULL,   -- Référence vers user-service.users
    fcm_token VARCHAR(255),
    apns_token VARCHAR(255),
    notification_preferences JSONB DEFAULT '{}',
    is_active BOOLEAN DEFAULT TRUE,
    last_sync_at TIMESTAMP DEFAULT NOW(),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_notification_tokens_device_id ON notification_tokens(device_id);
CREATE INDEX idx_notification_tokens_user_id ON notification_tokens(user_id);
CREATE INDEX idx_notification_tokens_is_active ON notification_tokens(is_active);

9.5 Synchronisation et Cohérence

9.5.1 Stratégies de Synchronisation

  • Pull : notification-service fait des appels gRPC périodiques pour récupérer les tokens
  • Push : auth-service notifie les événements importants via gRPC
  • Cache : notification-service peut mettre en cache les tokens avec TTL
  • Lazy Loading : Récupération des tokens à la demande lors d’envoi de notifications

9.5.2 Gestion des Incohérences

  • Eventual Consistency : Accepter un léger délai de synchronisation
  • Retry Logic : Mécanismes de retry avec backoff exponentiel
  • Health Checks : Vérifications régulières de la cohérence des données
  • Reconciliation : Processus de réconciliation en cas de désynchronisation

9.6 Performance et Résilience

9.6.1 Optimisations

  • Batch Requests : Récupération de tokens par lots pour plusieurs utilisateurs
  • Connection Pooling : Pool de connexions gRPC réutilisables
  • Circuit Breaker : Protection contre les pannes d’auth-service
  • Cache Local : Cache TTL dans notification-service pour réduire les appels

9.6.2 Résilience

  • Graceful Degradation : Mode dégradé si auth-service indisponible
  • Fallback Cache : Utilisation du cache local en cas de panne
  • Health Monitoring : Surveillance de la santé des communications inter-services
  • Alert System : Alertes en cas de problèmes de synchronisation

9.7 Monitoring des Communications

9.7.1 Métriques Istio Spécifiques

  • auth-service → notification-service : Latence des notifications d’événements
  • notification-service → auth-service : Fréquence et performance des appels GetDeviceTokens
  • mTLS Success Rate : Taux de succès des connexions sécurisées
  • Circuit Breaker Status : État des circuit breakers inter-services

9.7.2 Métriques Business

  • Token Sync Latency : Délai de synchronisation des tokens FCM/APNS
  • Event Delivery Rate : Taux de livraison des événements d’appareils
  • Cache Hit Rate : Efficacité du cache de tokens dans notification-service
  • API Response Time : Performance des APIs de gestion d’appareils

Politique de Sécurité - Service d’Authentification

0. Sommaire

1. Introduction

1.1 Objectif du Document

Cette politique de sécurité définit les mesures techniques et pratiques à implémenter pour protéger le service d’authentification (Identity Service) de l’application Whispr dans le cadre de notre projet de fin d’études.

1.2 Contexte et Importance

Le service d’authentification constitue la première ligne de défense de notre application. Il gère les informations d’identification des utilisateurs, les sessions, et les clés cryptographiques pour le chiffrement de bout en bout.

1.3 Principes Fondamentaux

  • Défense en profondeur: Multiples couches de sécurité
  • Moindre privilège: Accès limité au minimum nécessaire
  • Sécurité par conception: Considérations de sécurité intégrées dès la conception
  • Transparence: Documentation claire des mesures de sécurité
  • Mise en œuvre réaliste: Implémentation adaptée à nos contraintes de projet

2. Gestion des Identités et des Accès

2.1 Authentification des Utilisateurs

2.1.1 Vérification du Numéro de Téléphone

  • Codes de vérification à 6 chiffres générés aléatoirement
  • Validité limitée à 15 minutes
  • Maximum de 5 tentatives avant blocage temporaire
  • Envoi via un service SMS externe (Twilio ou équivalent)

2.1.2 Authentification à Deux Facteurs (2FA)

  • Implémentation du standard TOTP (RFC 6238)
  • Utilisation de l’algorithme HMAC-SHA1 avec une longueur de 6 chiffres
  • Intervalle de 30 secondes avec tolérance de ±1 intervalle
  • Possibilité de générer jusqu’à 10 codes de secours

2.1.3 Authentification Multi-Appareils

  • Mécanisme de scan QR pour appairer les appareils
  • Vérification croisée nécessitant un appareil déjà authentifié
  • Challenge cryptographique à courte durée de vie (5 minutes)
  • Coordination avec le notification-service pour la validation des appareils

2.2 Gestion des Sessions

2.2.1 Tokens d’Authentification

  • Architecture basée sur JWT (JSON Web Tokens)
  • Tokens d’accès de courte durée (1 heure)
  • Tokens de rafraîchissement de longue durée (30 jours)
  • Signature avec algorithme ES256 (ECDSA avec P-256 et SHA-256)
  • Inclusion du fingerprint de l’appareil dans les claims du token

2.2.2 Révocation et Invalidation

  • Stockage des tokens révoqués dans une liste noire Redis
  • Révocation en cascade des tokens enfants
  • Invalidation automatique en cas de changement de mot de passe
  • Possibilité de mettre fin à toutes les sessions à distance
  • Coordination avec le notification-service pour la révocation des tokens push

3. Chiffrement et Protection des Données

3.1 Chiffrement au Repos

3.1.1 Données Sensibles dans PostgreSQL

  • Chiffrement des colonnes sensibles avec AES-256-GCM:
    • Secrets TOTP (twoFactorSecret)
    • Clés privées chiffrées (privateKeyEncrypted)
  • Utilisation d’un module de chiffrement Node.js standard (crypto)
  • Stockage des clés de chiffrement dans des variables d’environnement

3.1.2 Données Temporaires dans Redis

  • Hachage des codes de vérification avec bcrypt (facteur de coût 10)
  • TTL strict sur toutes les données temporaires sensibles
  • Aucun stockage en clair des codes de sécurité

3.2 Chiffrement en Transit

3.2.1 Communications Externes

  • TLS 1.3 configuré pour toutes les communications API
  • Certificats auto-signés pour le développement, certificats Let’s Encrypt pour production
  • Configuration des suites de chiffrement sécurisées
  • HSTS pour forcer HTTPS

3.2.2 Communications Inter-Services avec Istio

  • Service Mesh Istio : Déploiement d’Istio pour la gestion du trafic et de la sécurité
  • mTLS automatique : Chiffrement et authentification mutuelle automatique entre tous les services
  • Gestion automatique des certificats : Istio gère la rotation et la distribution des certificats
  • Politiques de sécurité : Configuration des NetworkPolicies et AuthorizationPolicies Istio
  • Zero Trust Network : Aucune communication non chiffrée autorisée dans le cluster

3.3 Chiffrement de Bout en Bout (E2E)

3.3.1 Implémentation du Protocole Signal

  • Double Ratchet Algorithm pour la confidentialité persistante
  • Courbes elliptiques X25519 pour l’échange de clés Diffie-Hellman
  • Triple DHE pour l’établissement des sessions
  • HMAC-SHA256 pour l’authentification des messages

3.3.2 Gestion des Clés Cryptographiques

  • Génération de 100 prekeys par utilisateur
  • Rotation obligatoire des clés d’identité tous les 6 mois
  • Destruction sécurisée des clés expirées
  • Vérification des empreintes cryptographiques entre appareils

4. Protection Contre les Menaces

4.1 Contrôle des Accès et Rate Limiting

4.1.1 Limitation de Débit (Rate Limiting)

  • Implémentation du module @nestjs/throttler pour le rate limiting
  • Limitation par IP: maximum 30 requêtes/minute sur les endpoints d’authentification
  • Limitation par utilisateur: maximum 10 tentatives de vérification/heure
  • Limitation par téléphone: maximum 5 envois de SMS/heure
  • Délai progressif après échecs d’authentification répétés

4.1.2 Détection des Comportements Anormaux

  • Journalisation des tentatives d’authentification
  • Alerte simple pour les tentatives répétées échouées
  • Vérification basique de l’origine des connexions

4.2 Protection Contre les Attaques Courantes

4.2.1 Injection et XSS

  • Validation des entrées avec class-validator dans NestJS
  • Utilisation de TypeORM avec requêtes paramétrées
  • Configuration des headers de sécurité:
    • Content-Security-Policy
    • X-XSS-Protection
    • X-Content-Type-Options
  • Échappement des données dans les réponses API

4.2.2 CSRF et Clickjacking

  • Implémentation de protection CSRF pour les opérations sensibles
  • Configuration du header X-Frame-Options
  • Validation de l’origine des requêtes

4.2.3 Attaques par Déni de Service

  • Configuration des timeouts appropriés
  • Gestion des erreurs pour éviter les crashs
  • Documentation des stratégies de scaling

4.3 Sécurité Mobile

4.3.1 Stockage Sécurisé sur Appareil

  • Recommandations d’utilisation du Keystore/Keychain pour le stockage des tokens
  • Chiffrement des données sensibles stockées localement
  • Nettoyage des données sensibles lors de la déconnexion

4.3.2 Communication Sécurisée

  • Implémentation du certificate pinning basique
  • Vérification des signatures TLS
  • Prévention des captures d’écran sur les écrans sensibles dans l’application mobile

5. Gestion des Secrets

5.1 Sécurisation des Secrets d’Application

5.1.1 Stockage des Secrets

  • Utilisation des variables d’environnement pour les secrets
  • Configuration via dotenv (.env) avec différents fichiers par environnement
  • Exclusion stricte des fichiers .env du versionnement Git
  • Pas de secrets en dur dans le code (vérification via revues de code)

5.1.2 Rotation des Secrets

  • Procédure documentée pour la rotation des clés JWT
  • Procédure documentée pour la rotation des API keys des services tiers
  • Conservation des clés précédentes pendant une période de transition

5.2 Gestion des Clés de Chiffrement

5.2.1 Hiérarchie des Clés

  • Architecture à deux niveaux:
    • Clés maîtres (Key Encryption Keys, KEK)
    • Clés de chiffrement des données (Data Encryption Keys, DEK)
  • Dérivation de clés avec HKDF pour les usages spécifiques

5.2.2 Protection des Clés Maîtres

  • Clés maîtres stockées de manière sécurisée dans des variables d’environnement
  • Séparation des clés pour différents environnements (dev, test, prod)
  • Accès limité aux clés maîtres
  • Documentation du processus de gestion des clés

6. Détection et Réponse aux Incidents

6.1 Journalisation et Surveillance

6.1.1 Journalisation Sécurisée

  • Journalisation structurée des événements de sécurité:
    • Tentatives d’authentification (réussies et échouées)
    • Génération et utilisation de codes de vérification
    • Activation/désactivation de l’authentification 2FA
    • Modification des paramètres de sécurité
    • Événements de synchronisation avec les autres services
  • Format de journalisation JSON via NestJS Logger
  • Horodatage précis en UTC
  • Masquage des données sensibles dans les logs

6.1.2 Surveillance et Alertes

  • Logs consolidés dans une solution simple (par exemple ELK Stack basique)
  • Alertes configurées pour les modèles suspects:
    • Hausse des échecs d’authentification
    • Tentatives d’authentification depuis des localisations inhabituelles
    • Activités inhabituelles sur les comptes
  • Dashboard basique pour visualiser les activités de sécurité

6.2 Gestion des Incidents

6.2.1 Classification des Incidents

  • Niveaux de gravité définis:
    • Critique: Compromission potentielle des données utilisateur
    • Élevé: Violation de contrôle d’accès
    • Moyen: Tentatives répétées d’accès non autorisé
    • Faible: Anomalies mineures

6.2.2 Procédures de Réponse

  • Documentation des étapes à suivre en cas d’incident
  • Liste des personnes à contacter (membres du projet)
  • Instructions pour la collecte de preuves
  • Procédure pour limiter l’impact (ex: désactivation temporaire de fonctionnalités)

7. Sécurité du Développement

7.1 Pratiques de Développement Sécurisé

7.1.1 Recommandations de Sécurité

  • Application des principes OWASP Top 10 dans le développement
  • Utilisation des fonctionnalités de sécurité de NestJS
  • Documentation des décisions de sécurité dans le code
  • Revues de code avec attention particulière aux questions de sécurité

7.1.2 Revue de Code et Tests

  • Revue de sécurité pour les composants critiques
  • Tests unitaires pour les fonctionnalités de sécurité
  • Analyse statique de code avec ESLint et les règles de sécurité
  • Tests manuels des fonctionnalités sensibles

7.2 Gestion des Dépendances

7.2.1 Contrôle des Dépendances

  • Évaluation des dépendances avant intégration
  • Analyse des vulnérabilités avec npm audit
  • Utilisation de versions spécifiques des dépendances
  • Documentation des dépendances utilisées et de leur objectif

7.2.2 Mise à Jour des Dépendances

  • Vérification régulière des mises à jour de sécurité
  • Tests de régression après les mises à jour
  • Documentation du processus de mise à jour

8. Standards de Sécurité

8.1 Normes et Bonnes Pratiques

8.1.1 Conformité aux Standards

  • Alignement sur les standards pertinents:
    • OWASP Top 10
    • Bonnes pratiques NestJS
    • Recommandations de sécurité pour Node.js
  • Documentation des choix de sécurité et de leur justification

8.1.2 Protection des Données Personnelles

  • Principes RGPD appliqués comme bonne pratique
  • Minimisation des données collectées
  • Processus documenté de suppression des données

8.2 Tests de Sécurité

8.2.1 Tests Manuels

  • Tests d’application des contrôles de sécurité
  • Vérification des erreurs et failles évidentes
  • Tests des limites et des cas d’erreur
  • Test des fonctionnalités d’authentification et d’autorisation

8.2.2 Outils d’Analyse

  • Utilisation d’outils open-source pour l’analyse de sécurité
  • Vérification des vulnérabilités connues dans les dépendances
  • Analyse statique de code avec les règles de sécurité configurées

9. Sauvegarde et Récupération

9.1 Sauvegarde et Récupération

9.1.1 Stratégie de Sauvegarde

  • Sauvegardes régulières de la base de données PostgreSQL
  • Utilisation de pg_dump avec chiffrement des fichiers de sauvegarde
  • Conservation des sauvegardes pendant au moins 7 jours
  • Documentation du processus de sauvegarde

9.1.2 Plan de Récupération

  • Procédure documentée de restauration de la base de données
  • Tests de restauration effectués pendant la phase de développement
  • Documentation des dépendances entre services pour la récupération

9.2 Déploiement Sécurisé

9.2.1 Procédure de Déploiement

  • Environnements séparés (développement, test, production)
  • Validation des configurations avant déploiement
  • Scripts automatisés pour éviter les erreurs manuelles
  • Capacité de revenir à la version précédente

10. Communication Inter-Services avec Istio

10.1 Architecture Service Mesh

10.1.1 Configuration Istio

  • Service Mesh Istio : Déploiement d’Istio dans le cluster GKE pour gérer toutes les communications inter-services
  • Sidecar Envoy : Injection automatique des proxies Envoy dans tous les pods de microservices
  • mTLS strict : Configuration en mode STRICT pour forcer l’authentification mutuelle
  • Certificats automatiques : Istio génère et rotate automatiquement les certificats X.509

10.1.2 Politiques de Sécurité Istio

  • PeerAuthentication : Configuration mTLS strict pour tous les services
  • AuthorizationPolicy : Règles d’autorisation granulaires entre services
  • NetworkPolicy : Isolation réseau au niveau Kubernetes complétée par Istio
  • SecurityPolicy : Politiques de sécurité spécifiques par service
# Exemple de PeerAuthentication strict
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: whispr
spec:
  mtls:
    mode: STRICT

10.2 Sécurité des Communications

10.2.1 mTLS Automatique

  • Chiffrement automatique : Toutes les communications inter-services chiffrées par défaut
  • Authentification mutuelle : Vérification bidirectionnelle de l’identité des services
  • Rotation automatique des certificats : Gestion transparente du cycle de vie des certificats
  • Identité basée sur SPIFFE : Identités cryptographiques standardisées pour chaque service

10.2.2 Contrôle d’Accès Granulaire

  • Service-to-Service Authorization : Règles d’autorisation par service et par opération
  • JWT Validation : Validation des tokens JWT pour les requêtes utilisateur
  • Rate Limiting distribué : Limitation de débit au niveau du service mesh
  • Circuit Breakers : Protection contre les cascades de pannes

10.3 Gestion des Appareils avec Istio

10.3.1 Coordination Sécurisée auth-service ↔ notification-service

  • gRPC over mTLS : Communications sécurisées automatiquement par Istio
  • Service Discovery : Résolution automatique des services via Istio
  • Load Balancing : Répartition de charge intelligente entre les instances
  • Observabilité : Traces distribuées pour le debugging et l’audit

10.3.2 Politiques d’Autorisation Spécifiques

# AuthorizationPolicy pour auth-service → notification-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-to-notification
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: notification-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/auth-service"]
  - to:
    - operation:
        methods: ["POST", "GET", "PUT", "DELETE"]

10.4 Monitoring et Observabilité

10.4.1 Métriques de Sécurité

  • mTLS Success Rate : Taux de succès des connexions mTLS
  • Certificate Rotation Events : Événements de rotation des certificats
  • Authorization Denials : Tentatives d’accès refusées
  • Service-to-Service Latency : Latence des communications sécurisées

10.4.2 Logging et Audit

  • Access Logs Envoy : Logs détaillés de tous les accès inter-services
  • Audit des Politiques : Journalisation des applications de politiques de sécurité
  • Distributed Tracing : Traçage des requêtes à travers tous les services
  • Security Events : Alertes sur les événements de sécurité suspects

10.2 Gestion des Appareils

10.2.1 Coordination avec le Notification-Service

  • Enregistrement d’appareils: Le auth-service valide l’identité, le notification-service gère les métadonnées d’appareil
  • Révocation d’appareils: Coordination entre les services pour invalider les sessions et les tokens push
  • Synchronisation des états: Maintien de la cohérence entre les sessions actives et les appareils enregistrés

10.2.2 Sécurité des Références d’Appareils

  • Utilisation d’identifiants UUID pour les appareils (pas d’informations sensibles)
  • Validation croisée des références d’appareils entre services
  • Journalisation des événements de synchronisation pour audit
  • Gestion des cas où le notification-service est indisponible

11. Documentation

11.1 Documentation de Sécurité

11.1.1 Documentation Technique

  • Architecture de sécurité documentée
  • Guide d’implémentation des fonctionnalités de sécurité
  • Documentation du modèle de menaces
  • Diagrammes de flux de données avec contrôles de sécurité

11.1.2 Documentation Inter-Services

  • Interfaces de sécurité entre auth-service et notification-service
  • Procédures de synchronisation des données sécurisées
  • Documentation des dépendances de sécurité entre services
  • Guides de déploiement coordonné des services

11.2 Documentation Utilisateur

11.2.1 Guides Utilisateur

  • Guide d’utilisation des fonctionnalités de sécurité
  • Bonnes pratiques pour les utilisateurs
  • Procédure pour signaler des problèmes de sécurité

Annexes

A. Matrice des Risques et Contrôles

RisqueProbabilitéImpactMesures de Contrôle
Compromission des clés SignalFaibleCritiqueRotation des clés, stockage sécurisé
Attaque par force bruteMoyenneÉlevéRate limiting, détection des anomalies
Vol de token d’authentificationMoyenneÉlevéCourte durée de vie, révocation
Injection SQLFaibleCritiqueORM, requêtes paramétrées
Fuite de données sensiblesFaibleCritiqueChiffrement, masquage des logs
Compromission communication inter-servicesFaibleCritiquemTLS automatique Istio, AuthorizationPolicies
Déni de service sur service meshMoyenneÉlevéCircuit breakers, rate limiting Istio
Misconfiguration IstioMoyenneÉlevéValidation des policies, tests automatisés
Certificat mTLS compromisFaibleÉlevéRotation automatique, monitoring Istio
Désynchronisation inter-servicesFaibleMoyenService discovery Istio, retry policies

B. Références

  • OWASP Authentication Cheat Sheet
  • NIST Special Publication 800-63B: Digital Identity Guidelines
  • Signal Protocol Specification
  • NestJS Security Best Practices
  • Istio Security Best Practices
  • SPIFFE/SPIRE Documentation
  • Kubernetes Security Best Practices
  • Envoy Proxy Security Guide

Spécification Fonctionnelle - Authentification Whispr

0. Sommaire

1. Vue d’ensemble

1.1 Objectif

Cette spécification détaille les fonctionnalités d’authentification de l’application Whispr. Elle couvre l’inscription des utilisateurs, la connexion standard et l’authentification multi-appareils via QR code. Ces fonctionnalités constituent le socle sécuritaire de l’application, permettant de garantir l’identité des utilisateurs tout en offrant une expérience utilisateur fluide.

1.2 Principes clés

  • Vérification par téléphone: Confirmation de l’identité par code SMS
  • Sans mot de passe: Utilisation exclusive de la vérification par téléphone et des tokens
  • Multi-appareils: Possibilité de se connecter sur plusieurs appareils de manière sécurisée
  • Sécurité renforcée: Support optionnel de la 2FA (détaillée dans une spécification séparée)
  • Tokens JWT: Gestion des sessions via tokens d’accès et de rafraîchissement
  • Architecture centralisée: auth-service comme autorité unique pour authentification et appareils
  • Coordination inter-services: Séparation des responsabilités avec coordination sécurisée

1.3 Composants fonctionnels

Le système d’authentification comprend trois processus principaux:

  1. Inscription: Vérification du numéro de téléphone et création de compte avec enregistrement d’appareil
  2. Connexion: Authentification standard avec vérification par SMS et gestion d’appareil
  3. Authentification multi-appareils: Connexion par scan de QR code avec enregistrement direct d’appareil

1.4 Architecture des services

graph TD
    A[Client] --> B[API Gateway]
    B --> C[Auth Service]
    B --> D[User Service]
    B --> E[Notification Service]
    
    C -.->|gRPC over mTLS| D
    C -.->|gRPC over mTLS| E
    E -.->|gRPC over mTLS| C
    
    C --> F[(PostgreSQL Auth + Devices)]
    D --> G[(PostgreSQL User)]
    E --> H[(PostgreSQL Notifications)]
    
    subgraph "Istio Service Mesh"
        C
        D
        E
    end

Responsabilités des services:

  • auth-service: Authentification, vérification SMS, tokens JWT, gestion complète des appareils, clés cryptographiques, sessions
  • user-service: Profils utilisateurs, contacts, paramètres, préférences
  • notification-service: Cache léger des tokens push, notifications, récupération d’infos d’appareils depuis auth-service

2. Processus d’inscription

sequenceDiagram
    participant Client
    participant APIGateway
    participant AuthService
    participant UserService
    participant NotificationService
    participant ExternalSMS
    participant Redis
    
    Client->>APIGateway: POST /auth/register/verify/request 
    APIGateway->>AuthService: Forward request
    AuthService->>UserService: Check if phone exists (gRPC over mTLS)
    UserService-->>AuthService: Phone not registered
    AuthService->>Redis: Store verification data & generate code
    AuthService->>ExternalSMS: Send verification code
    ExternalSMS-->>Client: Send SMS with code
    AuthService-->>Client: 200 OK (verification initiated)
    
    Client->>APIGateway: POST /auth/register/verify/confirm
    APIGateway->>AuthService: Forward request
    AuthService->>Redis: Verify code
    Redis-->>AuthService: Code valid
    
    Client->>APIGateway: POST /auth/register
    APIGateway->>AuthService: Forward request with device info
    AuthService->>UserService: Create user (gRPC over mTLS)
    UserService-->>AuthService: User created successfully
    
    Note over AuthService: Enregistrement direct de l'appareil
    AuthService->>AuthService: Create device entry in devices table
    AuthService->>AuthService: Generate deviceId and store metadata
    AuthService->>AuthService: Store FCM/APNS tokens
    
    Note over AuthService,NotificationService: Notification pour cache
    AuthService->>NotificationService: NotifyDeviceRegistered (gRPC over mTLS)
    Note over AuthService,NotificationService: deviceId, userId, fcmToken pour cache
    NotificationService->>NotificationService: Create cache entry for notifications
    
    AuthService->>AuthService: Generate tokens with deviceId
    AuthService-->>Client: 201 Created with tokens + deviceId

2.1 Explication du processus d’inscription

Phase 1: Vérification du numéro de téléphone

  1. Demande de vérification: L’utilisateur soumet son numéro de téléphone via l’application.
  2. Vérification de disponibilité:
    • Le service d’authentification communique avec le service utilisateur via gRPC over mTLS (sécurisé par Istio)
    • Vérifie que le numéro n’est pas déjà enregistré dans le système
  3. Génération du code:
    • Un code numérique à 6 chiffres est généré aléatoirement
    • Le code est haché et stocké dans Redis avec l’identifiant de vérification et le numéro
    • Un TTL de 15 minutes est appliqué pour limiter la validité temporelle du code
  4. Envoi du SMS:
    • Le code est envoyé via un service SMS externe (Twilio ou équivalent)
    • L’application affiche un message de confirmation d’envoi

Phase 2: Confirmation du code

  1. Saisie du code: L’utilisateur entre le code reçu par SMS dans l’application.
  2. Validation:
    • Le service récupère le hash du code stocké dans Redis avec l’identifiant de vérification
    • Compare le code soumis avec celui stocké (après application du même algorithme de hachage)
    • Vérifie que le code n’a pas expiré et que le nombre de tentatives maximum n’est pas dépassé
  3. Enregistrement de la validation:
    • Le statut de vérification est mis à jour dans Redis
    • Une période de validité de 60 minutes est accordée pour finaliser l’inscription

Phase 3: Création du compte et enregistrement de l’appareil

  1. Soumission des informations: L’utilisateur complète son profil (nom, prénom, éventuellement photo) et fournit les informations d’appareil.
  2. Création du compte:
    • Le service d’authentification vérifie que le numéro a bien été validé précédemment
    • Les données utilisateur sont transmises au service utilisateur via gRPC over mTLS
    • Le service utilisateur crée l’entrée dans sa base de données et attribue un UUID
    • Le service d’authentification crée l’entrée correspondante dans sa propre base
  3. Enregistrement direct de l’appareil dans auth-service:
    • Le service d’authentification crée directement l’entrée dans la table devices
    • Génère un deviceId unique et stocke toutes les métadonnées (nom, type, fingerprint, clés publiques)
    • Stocke les tokens FCM/APNS pour les notifications
    • Initialise les clés cryptographiques pour le chiffrement E2E
  4. Notification pour synchronisation:
    • Le service d’authentification notifie le notification-service du nouvel appareil
    • Transfère les informations essentielles (deviceId, userId, tokens) pour le cache de notifications
    • Le notification-service crée une entrée légère pour optimiser l’envoi de notifications
  5. Génération des tokens:
    • Un token d’accès (courte durée: 1 heure) est généré avec le deviceId
    • Un token de rafraîchissement (longue durée: 30 jours) est généré
    • Les deux tokens sont signés avec l’algorithme ES256
  6. Finalisation:
    • Les tokens et le deviceId sont renvoyés au client
    • L’utilisateur est authentifié et peut accéder à l’application

2.2 Mesures de sécurité

  • Rate limiting: Maximum 5 demandes de vérification par numéro par heure
  • Expiration des codes: Validité de 15 minutes pour limiter les fenêtres d’attaque
  • Tentatives limitées: Maximum 5 tentatives de validation par code
  • Hachage des codes: Les codes ne sont jamais stockés en clair
  • Validation séquentielle: Impossible de créer un compte sans vérification préalable
  • Gestion centralisée des appareils: Contrôle complet par auth-service pour la sécurité
  • Communications sécurisées: Toutes les communications inter-services via mTLS automatique (Istio)

3. Processus d’authentification

sequenceDiagram
    participant Client
    participant APIGateway
    participant AuthService
    participant UserService
    participant NotificationService
    participant ExternalSMS
    participant Redis
    
    Client->>APIGateway: POST /auth/login/verify/request
    APIGateway->>AuthService: Forward request
    AuthService->>UserService: Check if phone exists (gRPC over mTLS)
    UserService-->>AuthService: Phone registered
    AuthService->>Redis: Store verification data & generate code
    AuthService->>ExternalSMS: Send verification code
    ExternalSMS-->>Client: SMS with code
    AuthService-->>Client: 200 OK (verification initiated)
    
    Client->>APIGateway: POST /auth/login/verify/confirm
    APIGateway->>AuthService: Forward request
    AuthService->>Redis: Verify code
    Redis-->>AuthService: Code valid
    
    Client->>APIGateway: POST /auth/login
    APIGateway->>AuthService: Forward request with device info
    AuthService->>UserService: Get user (gRPC over mTLS)
    UserService-->>AuthService: User details retrieved
    
    Note over AuthService: Gestion directe de l'appareil
    AuthService->>AuthService: Check device in devices table (by fingerprint)
    
    alt Appareil existant
        AuthService->>AuthService: Update device metadata (last_active, IP, etc.)
        AuthService->>AuthService: Verify device status and keys
    else Nouvel appareil
        AuthService->>AuthService: Create new device entry
        AuthService->>AuthService: Generate deviceId and store metadata
        AuthService->>AuthService: Initialize cryptographic keys
        
        AuthService->>NotificationService: NotifyDeviceRegistered (gRPC over mTLS)
        NotificationService->>NotificationService: Create cache entry
    end
    
    alt 2FA Enabled
        AuthService-->>Client: 200 OK (2FA required)
        Client->>APIGateway: POST /auth/2fa/verify
        APIGateway->>AuthService: Forward request
        AuthService->>AuthService: Verify 2FA code
    end
    
    AuthService->>AuthService: Generate tokens with deviceId
    AuthService->>AuthService: Log successful login in login_history
    AuthService-->>Client: 200 OK with tokens + deviceId

3.1 Explication du processus d’authentification

Phase 1: Vérification du numéro

  1. Demande de vérification: L’utilisateur soumet son numéro de téléphone pour se connecter.
  2. Vérification d’existence:
    • Le service authentification vérifie via gRPC over mTLS que le numéro est bien enregistré
    • Si le numéro n’existe pas, une erreur est retournée
  3. Génération et envoi du code:
    • Processus identique à celui de l’inscription
    • Un code à 6 chiffres est généré, haché et stocké
    • Le code est envoyé par SMS à l’utilisateur

Phase 2: Validation du code

  1. Vérification du code:
    • L’utilisateur saisit le code reçu
    • Le système vérifie la validité comme pour l’inscription
  2. Validation de l’identité:
    • La validation du code confirme que l’utilisateur possède bien le téléphone associé au compte

Phase 3: Gestion directe de l’appareil et connexion finale

  1. Identification/Enregistrement de l’appareil dans auth-service:

    • Le client envoie les informations de l’appareil (fingerprint, type, nom, token FCM/APNS)
    • Le service d’authentification vérifie directement dans sa table devices
    • Si l’appareil est reconnu (même fingerprint), il met à jour les métadonnées (dernière activité, IP, etc.)
    • Si c’est un nouvel appareil, il crée une nouvelle entrée avec un deviceId unique
    • Initialise ou vérifie les clés cryptographiques pour le E2E
  2. Notification pour cache de notifications:

    • Si c’est un nouvel appareil, auth-service notifie le notification-service
    • Transfère les informations essentielles pour permettre l’envoi de notifications push
    • Le notification-service maintient un cache léger pour optimiser les performances
  3. Récupération des informations utilisateur:

    • Le service d’authentification interroge le service utilisateur pour obtenir les détails du compte
    • Le service vérifie si la 2FA est activée pour ce compte
  4. Vérification 2FA (si activée):

    • Si la 2FA est activée, une étape supplémentaire est requise
    • L’utilisateur doit fournir un code généré par son application d’authentification
    • Le processus détaillé est couvert dans la spécification 2FA
  5. Génération des tokens et finalisation:

    • Des tokens JWT sont générés avec le deviceId inclus dans les claims
    • L’accès à l’application est accordé
    • La connexion est journalisée dans login_history avec le deviceId

3.2 Gestion des sessions

  • Token d’accès: Validité courte (1 heure) pour limiter les risques de vol, contient le deviceId
  • Token de rafraîchissement: Validité longue (30 jours) pour éviter les reconnexions fréquentes
  • Révocation centralisée: Les tokens peuvent être révoqués directement par auth-service
  • Renouvellement transparent: Le token d’accès peut être renouvelé automatiquement via le token de rafraîchissement
  • Lien avec l’appareil: Chaque session est liée à un deviceId spécifique

3.3 Mesures de sécurité

  • Rate limiting renforcé: Protection contre les attaques par force brute
  • Détection d’anomalies: Alertes sur des connexions depuis des localisations inhabituelles
  • Journalisation complète: Enregistrement des tentatives de connexion dans login_history avec informations d’appareil
  • Gestion centralisée: Contrôle complet des appareils et sessions par auth-service
  • Communications sécurisées: Toutes les communications inter-services via mTLS automatique (Istio)

4. Authentification multi-appareils (QR Code)

sequenceDiagram
    participant ClientNew
    participant ClientAuth
    participant APIGateway
    participant AuthService
    participant UserService
    participant NotificationService
    participant Redis
    
    ClientNew->>ClientNew: Generate challenge with device metadata
    ClientNew->>ClientNew: Display QR code
    ClientAuth->>ClientNew: Scan QR code
    ClientAuth->>APIGateway: POST /auth/scan-login
    APIGateway->>AuthService: Forward request
    
    Note over AuthService: Vérification directe de l'appareil authentifié
    AuthService->>AuthService: Verify existing device (check deviceId and session)
    AuthService->>AuthService: Validate QR challenge and device authorization
    
    Note over AuthService: Enregistrement direct du nouvel appareil
    AuthService->>AuthService: Extract device info from QR challenge
    AuthService->>AuthService: Create new device entry in devices table
    AuthService->>AuthService: Generate deviceId and store metadata
    AuthService->>AuthService: Initialize cryptographic keys
    
    AuthService->>Redis: Store authenticated session with deviceId
    
    Note over AuthService,NotificationService: Notification pour cache
    AuthService->>NotificationService: NotifyDeviceRegistered (gRPC over mTLS)
    NotificationService->>NotificationService: Create cache entry for notifications
    
    AuthService-->>ClientAuth: 200 OK
    ClientAuth-->>ClientNew: Notify success
    
    AuthService->>AuthService: Generate tokens for new device
    AuthService-->>ClientNew: 200 OK with tokens + deviceId

4.1 Explication de l’authentification par QR code

Phase 1: Initialisation sur le nouvel appareil

  1. Génération du challenge:
    • Le nouvel appareil génère un challenge cryptographique temporaire
    • Ce challenge contient un identifiant de session unique, une signature et les métadonnées complètes de l’appareil
    • Une durée de validité courte (5 minutes) est encodée dans le challenge
  2. Affichage du QR code:
    • Le challenge est encodé en QR code
    • Un écran d’attente est affiché avec instructions pour l’utilisateur

Phase 2: Scan et autorisation

  1. Scan par l’appareil authentifié:
    • L’utilisateur utilise un appareil déjà connecté pour scanner le QR code
    • L’application décode le challenge et extrait les informations
  2. Autorisation:
    • L’utilisateur confirme qu’il souhaite connecter le nouvel appareil
    • L’appareil authentifié envoie une requête au serveur contenant:
      • Le challenge scanné
      • Son propre token d’authentification
      • Des informations sur le nouvel appareil

Phase 3: Validation et enregistrement centralisés dans auth-service

  1. Vérification de l’appareil existant:
    • Le service d’authentification vérifie le token de l’appareil qui fait la demande
    • Vérifie directement dans sa table devices que l’appareil est bien enregistré et actif
    • Confirme que l’appareil a les droits pour autoriser de nouveaux appareils
  2. Validation du challenge:
    • Vérifie l’authenticité et la validité temporelle du challenge
    • S’assure qu’il n’a pas déjà été utilisé
  3. Enregistrement direct du nouvel appareil:
    • Le service d’authentification extrait les métadonnées du nouvel appareil du challenge
    • Crée directement une nouvelle entrée dans la table devices
    • Génère un deviceId unique et stocke toutes les informations
    • Initialise les clés cryptographiques nécessaires pour le E2E
  4. Notification pour synchronisation:
    • Informe le notification-service du nouvel appareil pour créer le cache de notifications
    • Transfère les informations essentielles (deviceId, tokens FCM/APNS)

Phase 4: Finalisation

  1. Confirmation à l’appareil authentifié:
    • Un message de succès est envoyé à l’appareil qui a scanné le QR
  2. Notification au nouvel appareil:
    • Le nouvel appareil est notifié que l’authentification est réussie
    • Des tokens JWT lui sont délivrés avec le deviceId inclus pour accéder à l’application
  3. Journalisation:
    • L’événement d’ajout d’appareil est enregistré dans login_history
    • L’opération est tracée pour l’audit

4.2 Avantages sécuritaires

  • Pas de saisie d’identifiants: Réduit les risques de phishing et de vol de credentials
  • Double contrôle: Nécessite un appareil déjà authentifié pour confirmer l’identité
  • Challenge à usage unique: Empêche la réutilisation du QR code
  • Expiration rapide: Limite la fenêtre temporelle d’attaque
  • Confirmation explicite: L’utilisateur doit activement approuver l’ajout du nouvel appareil
  • Gestion centralisée: Vérification et enregistrement complets par auth-service
  • Coordination sécurisée: Communication avec notification-service pour le cache uniquement

5. Gestion des appareils intégrée

5.1 Responsabilités centralisées

Avec l’architecture centralisée, auth-service est la source de vérité unique pour tous les aspects liés aux appareils :

Ce que fait le auth-service :

  • Authentification et validation des utilisateurs
  • Génération et vérification des tokens JWT
  • Gestion des codes de vérification SMS et 2FA
  • Stockage et gestion complète des métadonnées d’appareils
  • Enregistrement et révocation d’appareils
  • Gestion des clés cryptographiques par appareil
  • Suivi de l’activité et du statut des appareils
  • Historique des sessions par appareil via login_history

Ce que fait le notification-service :

  • Cache léger des informations d’appareils pour optimiser les notifications
  • Envoi des notifications push
  • Récupération d’informations d’appareils depuis auth-service via gRPC

Ce que fait le user-service :

  • Stockage et gestion des profils utilisateurs
  • Gestion des contacts et relations sociales
  • Paramètres et préférences utilisateur

5.2 Coordination avec les autres services

Le service d’authentification coordonne avec les autres services selon ces patterns :

  1. Avec notification-service :

    • auth-service → notification-service : Notification des événements d’appareils (ajout, suppression, mise à jour)
    • notification-service → auth-service : Récupération d’informations d’appareils pour l’envoi de notifications
  2. Avec user-service :

    • auth-service → user-service : Récupération des profils et préférences utilisateur
    • user-service → auth-service : Notification des changements de profil nécessitant une synchronisation

5.3 Communication sécurisée

Toutes les communications entre les services utilisent :

  • gRPC over mTLS : Protocole sécurisé géré automatiquement par Istio
  • AuthorizationPolicies : Contrôles d’accès granulaires au niveau service mesh
  • Distributed Tracing : Traçabilité complète des opérations via Jaeger
  • Circuit Breakers : Protection automatique contre les pannes de services

Configuration exemple :

# AuthorizationPolicy pour notification-service vers auth-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: notification-to-auth
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: auth-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/notification-service"]
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/auth.AuthService/GetDeviceTokens", "/auth.AuthService/GetUserDevices"]

6. Endpoints API

6.1 Endpoints d’authentification

EndpointMéthodeDescriptionServices impliqués
/auth/register/verify/requestPOSTDemande de code de vérification pour inscriptionauth-service → user-service
/auth/register/verify/confirmPOSTConfirmation du code de vérificationauth-service
/auth/registerPOSTFinalisation de l’inscription avec enregistrement d’appareilauth-service → user-service, notification-service
/auth/login/verify/requestPOSTDemande de code de vérification pour connexionauth-service → user-service
/auth/login/verify/confirmPOSTConfirmation du code de vérificationauth-service
/auth/loginPOSTFinalisation de la connexion avec gestion d’appareilauth-service → user-service, notification-service
/auth/scan-loginPOSTAuthentification par QR code avec enregistrement d’appareilauth-service → notification-service
/auth/logoutPOSTDéconnexion avec gestion de session d’appareilauth-service → notification-service
/auth/refreshPOSTRenouvellement de tokenauth-service

6.2 Headers requis

  • Authorization: Bearer <access_token> pour les endpoints protégés
  • X-Device-Info: Informations sur l’appareil (fingerprint, type, etc.)
  • X-Request-ID: Identifiant unique pour le tracing distribué

6.3 Réponses type

{
  "success": true,
  "data": {
    "accessToken": "jwt_access_token",
    "refreshToken": "jwt_refresh_token",
    "deviceId": "uuid_device_id",
    "expiresIn": 3600
  }
}

7. Tests

7.1 Tests unitaires

  • Génération et validation des codes de vérification
  • Génération et validation des tokens JWT
  • CRUD des appareils dans auth-service
  • Logique d’authentification et gestion d’erreurs
  • Communication avec les services externes (SMS)
  • Gestion des clés cryptographiques

7.2 Tests d’intégration inter-services

  • Communication auth-service ↔ user-service (gRPC over mTLS)
  • Communication auth-service → notification-service (notifications d’événements)
  • Communication notification-service → auth-service (récupération d’infos)
  • Processus complet d’inscription avec enregistrement d’appareil intégré
  • Processus complet de connexion avec gestion d’appareil directe
  • Authentification par QR code avec enregistrement centralisé

7.3 Tests de sécurité

  • Validation des communications mTLS entre services
  • Tentatives d’accès non autorisées aux endpoints et données d’appareils
  • Tests de rate limiting et protection contre les attaques par force brute
  • Validation de l’intégrité des tokens JWT avec claims d’appareil
  • Tests de résistance aux attaques par rejeu
  • Sécurité de la gestion centralisée des appareils

8. Considérations opérationnelles

8.1 Monitoring et observabilité

  • Métriques Istio : Latence et taux de succès des communications inter-services
  • Métriques auth-service :
    • Taux de succès des authentifications
    • Performance de gestion des appareils
    • Utilisation des tokens et sessions
    • Santé des clés cryptographiques
  • Tracing distribué : Suivi des requêtes à travers tous les services impliqués
  • Logs corrélés : Logs structurés avec correlation IDs et deviceIds pour faciliter le debugging
  • Alertes : Surveillance des pannes de communication entre services

8.2 Gestion des pannes

  • Circuit breakers : Protection automatique contre les services défaillants
  • Retry policies : Tentatives automatiques avec backoff exponentiel
  • Graceful degradation : Modes dégradés quand notification-service ou user-service sont indisponibles
  • Health checks : Vérifications de santé régulières des services
  • Fallback mechanisms : Fonctionnement en mode dégradé pour l’authentification critique

8.3 Scalabilité

  • Scaling horizontal : Chaque service peut être scalé indépendamment
  • Load balancing : Répartition automatique de charge via Istio
  • Stateless design : Services sans état pour faciliter le scaling
  • Cache distribué : Redis pour les données temporaires partagées
  • Database optimization : Index appropriés sur la table devices pour les performances

Livrables

Backend

  • AuthModule: Module d’authentification principal (NestJS)
  • VerificationModule: Module de vérification SMS et codes
  • TokenModule: Module de gestion des tokens JWT
  • DeviceModule: Module de gestion intégrée des appareils
  • QRAuthModule: Module d’authentification par QR code
  • NotificationCoordinationModule: Module de coordination avec notification-service

Frontend

  • Écrans d’inscription: Interface de création de compte avec enregistrement d’appareil
  • Écrans de connexion: Interface de connexion standard avec gestion d’appareil
  • Interface QR: Composant de scan et affichage de QR codes
  • Gestion d’erreurs: Interface cohérente pour les erreurs d’authentification
  • Interface de gestion d’appareils: Composants pour visualiser et gérer les appareils

Configuration

  • Policies Istio: Configurations AuthorizationPolicy et PeerAuthentication
  • Scripts de déploiement: Automatisation du déploiement coordonné des services
  • Monitoring: Dashboards et alertes pour l’observabilité
  • Database migrations: Scripts de migration pour la table devices dans auth-service

Spécification Fonctionnelle - Authentification à Deux Facteurs (2FA)

0. Sommaire

1. Vue d’ensemble

1.1 Objectif

L’authentification à deux facteurs (2FA) renforce la sécurité du processus d’authentification en ajoutant une deuxième couche de vérification, indépendante de la première. Pour Whispr, nous implémentons la 2FA basée sur TOTP (Time-based One-Time Password) conformément à la RFC 6238, compatible avec les applications d’authentification standard comme Google Authenticator, Microsoft Authenticator ou Authy.

1.2 Principes clés

  • Quelque chose que vous connaissez (première couche): Vérification par SMS
  • Quelque chose que vous possédez (deuxième couche): Code temporaire généré par une application d’authentification
  • Optionnalité: La 2FA est proposée mais optionnelle pour les utilisateurs
  • Solution de secours: Des codes de récupération sont fournis en cas de perte d’accès à l’application d’authentification
  • Multi-appareils: Fonctionnement cohérent à travers tous les appareils de l’utilisateur
  • Architecture centralisée: auth-service gère la 2FA et coordonne avec les autres services via Istio Service Mesh

1.3 Composants fonctionnels

Le système 2FA comprend quatre processus principaux:

  1. Activation de la 2FA: Configuration initiale et liaison de l’application d’authentification
  2. Authentification avec 2FA: Vérification du code temporaire lors de la connexion
  3. Gestion des codes de secours: Génération, visualisation et utilisation des codes de récupération
  4. Synchronisation multi-appareils: Cohérence des paramètres 2FA entre tous les appareils

1.4 Architecture des services

graph TD
    A[Client] --> B[API Gateway]
    B --> C[Auth Service]
    B --> D[User Service]
    B --> E[Notification Service]
    
    C -.->|gRPC over mTLS| D
    C -.->|gRPC over mTLS| E
    E -.->|gRPC over mTLS| C
    
    C --> F[(PostgreSQL Auth + Devices)]
    D --> G[(PostgreSQL User)]
    E --> H[(PostgreSQL Notifications)]
    
    subgraph "Istio Service Mesh"
        C
        D
        E
    end
    
    subgraph "2FA Data Distribution"
        F --> I[TOTP Secrets]
        F --> J[Backup Codes]
        F --> K[Device Management]
        F --> L[Device Verification Status]
        D --> M[2FA Settings]
        E --> N[Notification Cache]
    end

Responsabilités pour la 2FA :

  • auth-service: Secrets TOTP, codes de secours, validation des codes, logique 2FA, gestion complète des appareils et statut de vérification
  • user-service: Paramètres utilisateur 2FA (activé/désactivé), préférences
  • notification-service: Cache léger pour notifications, récupération d’infos d’appareils depuis auth-service

2. Flux d’activation de la 2FA

sequenceDiagram
    participant User as Utilisateur
    participant Client as Application Client
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    participant Redis as Cache Redis
    
    User->>Client: Demande d'activation de la 2FA
    Client->>APIGateway: POST /auth/2fa/enable
    APIGateway->>AuthService: Forward request
    AuthService->>UserService: Vérifier utilisateur (gRPC over mTLS)
    UserService-->>AuthService: Utilisateur vérifié
    
    AuthService->>AuthService: Génère secret TOTP
    AuthService->>Redis: Stocke secret temporairement
    AuthService-->>Client: 200 OK avec secret, otpauth_url et QR code
    
    Client->>User: Affiche QR code et clé secrète
    User->>User: Scanne QR code avec app d'authentification
    User->>Client: Entre code de vérification
    
    Client->>APIGateway: POST /auth/2fa/verify
    APIGateway->>AuthService: Forward request
    AuthService->>Redis: Récupère secret temporaire
    AuthService->>AuthService: Valide code TOTP
    
    alt Code valide
        AuthService->>AuthService: Génère 10 codes de secours
        AuthService->>UserService: Active 2FA et stocke paramètres (gRPC over mTLS)
        UserService-->>AuthService: 2FA activée côté profil
        AuthService->>AuthService: Stocke secret et codes définitivement
        
        Note over AuthService: Mise à jour directe des appareils
        AuthService->>AuthService: Marquer tous appareils utilisateur comme nécessitant 2FA
        AuthService->>AuthService: Mettre à jour statut de vérification
        
        AuthService->>NotificationService: Notifier activation 2FA (gRPC over mTLS)
        NotificationService->>NotificationService: Envoyer notifications de sécurité
        NotificationService-->>AuthService: Notifications envoyées
        
        AuthService-->>Client: 200 OK avec codes de secours
        Client->>User: Affiche codes de secours
        User->>User: Enregistre codes de secours
    else Code invalide
        AuthService-->>Client: 401 Unauthorized
        Client->>User: Affiche erreur de validation
    end

2.1 Explication du flux d’activation

Phase de préparation

  1. Initiation: L’utilisateur demande l’activation de la 2FA depuis les paramètres de sécurité.
  2. Vérification préalable: Le service authentifie l’utilisateur et vérifie qu’il n’a pas déjà activé la 2FA.
  3. Génération du secret: Un secret TOTP aléatoire de 20 octets est généré et encodé en Base32.
  4. Création de l’URL TOTP: Une URL otpauth:// est construite selon le format standard, incluant:
    • Le nom de l’application (Whispr)
    • L’identifiant de l’utilisateur (numéro de téléphone ou nom d’utilisateur)
    • Le secret TOTP
    • Les paramètres: algorithme (SHA1), période (30 secondes), digits (6)
  5. Génération du QR Code: L’URL TOTP est encodée dans un QR code.

Phase de validation

  1. Association de l’application: L’utilisateur scanne le QR code avec son application d’authentification.
  2. Vérification: L’utilisateur saisit le code à 6 chiffres généré par l’application.
  3. Validation du code: Le service vérifie que le code est correct, avec une fenêtre de tolérance de ±1 période (30s).
  4. Génération des codes de secours: Si le code est valide, 10 codes de secours alphanumériques sont générés.
  5. Activation coordonnée:
    • Le secret TOTP et les codes de secours (hachés) sont stockés dans auth-service
    • Les paramètres utilisateur sont mis à jour dans user-service
    • Tous les appareils utilisateur sont marqués comme nécessitant 2FA directement dans auth-service
    • notification-service est informé pour envoyer des notifications de sécurité
  6. Confirmation: Les codes de secours sont présentés une seule fois à l’utilisateur pour sauvegarde.

Coordination inter-services

  • auth-service: Stocke les secrets cryptographiques, gère la validation et met à jour le statut des appareils
  • user-service: Met à jour les préférences utilisateur (2FA activée)
  • notification-service: Envoie des notifications de sécurité sur tous les appareils

3. Flux d’authentification avec 2FA activée

sequenceDiagram
    participant User as Utilisateur
    participant Client as Application Client
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    participant ExternalSMS as Service SMS
    participant Redis as Cache Redis
    
    User->>Client: Saisit numéro de téléphone
    Client->>APIGateway: POST /auth/login/verify/request
    APIGateway->>AuthService: Forward request
    AuthService->>UserService: Vérifier numéro (gRPC over mTLS)
    UserService-->>AuthService: Numéro validé
    AuthService->>Redis: Stocke challenge et génère code
    AuthService->>ExternalSMS: Envoie code SMS
    ExternalSMS-->>User: SMS avec code
    AuthService-->>Client: 200 OK (vérification initiée)
    
    User->>Client: Saisit code SMS reçu
    Client->>APIGateway: POST /auth/login/verify/confirm
    APIGateway->>AuthService: Forward request
    AuthService->>Redis: Vérifie code SMS
    Redis-->>AuthService: Code valide
    
    AuthService->>UserService: Vérifier statut 2FA (gRPC over mTLS)
    UserService-->>AuthService: 2FA activée
    
    Note over AuthService: Gestion directe de l'appareil
    AuthService->>AuthService: Identifier/enregistrer appareil
    AuthService->>AuthService: Vérifier statut 2FA requis pour appareil
    
    AuthService-->>Client: 200 OK (2FA requise, deviceId inclus)
    
    Client->>User: Demande code TOTP
    User->>User: Ouvre app d'authentification
    User->>Client: Saisit code 2FA
    
    Client->>APIGateway: POST /auth/2fa/verify
    APIGateway->>AuthService: Forward request avec deviceId
    AuthService->>AuthService: Récupérer secret TOTP utilisateur
    AuthService->>AuthService: Valide code TOTP
    
    alt Code TOTP valide
        AuthService->>AuthService: Génère tokens avec deviceId
        AuthService->>AuthService: Marquer appareil comme vérifié 2FA
        AuthService->>AuthService: Journaliser connexion dans login_history
        AuthService->>UserService: Notifier connexion réussie (gRPC over mTLS)
        AuthService-->>Client: 200 OK avec tokens + deviceId
        Client->>User: Accès autorisé à l'application
    else Code TOTP invalide
        AuthService->>AuthService: Incrémenter compteur tentatives
        AuthService-->>Client: 401 Unauthorized avec tentatives restantes
        Client->>User: Affiche erreur et option codes de secours
    end

3.1 Explication du flux d’authentification

Première étape: Vérification du téléphone

  1. Identique au processus standard: L’utilisateur suit le flux normal de vérification par SMS.
  2. Détection automatique: Après validation du code SMS, le système détecte que l’utilisateur a activé la 2FA via user-service.

Deuxième étape: Vérification TOTP avec gestion centralisée des appareils

  1. Gestion directe de l’appareil: auth-service identifie ou enregistre l’appareil utilisé dans sa propre table devices.
  2. Vérification du statut 2FA: auth-service vérifie si l’appareil nécessite une vérification 2FA.
  3. Demande de code 2FA: L’application demande à l’utilisateur de fournir le code de son application d’authentification.
  4. Génération du code: L’utilisateur ouvre son application d’authentification qui génère un code à 6 chiffres basé sur:
    • Le secret partagé (stocké dans auth-service)
    • L’heure actuelle (arrondie à la période de 30 secondes)
  5. Vérification du code: Le service:
    • Récupère le secret TOTP associé à l’utilisateur
    • Calcule le code attendu pour la période actuelle
    • Compare le code soumis avec le code attendu (avec tolérance)
  6. Finalisation centralisée: Si le code est valide:
    • L’authentification est complétée avec génération de tokens JWT incluant deviceId
    • L’appareil est marqué comme vérifié 2FA directement dans auth-service
    • La connexion est journalisée dans login_history

Cas d’erreur et gestion des tentatives

  • Si le code est invalide, l’utilisateur peut réessayer jusqu’à 5 fois avant blocage temporaire
  • Après 5 tentatives infructueuses, l’utilisateur doit attendre 30 minutes ou utiliser un code de secours
  • L’option des codes de secours est proposée dès la première erreur

4. Flux d’utilisation des codes de secours

sequenceDiagram
    participant User as Utilisateur
    participant Client as Application Client
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    
    User->>Client: Choisit "Utiliser code de secours"
    Client->>User: Affiche interface de saisie
    User->>Client: Saisit un code de secours
    
    Client->>APIGateway: POST /auth/2fa/recovery
    APIGateway->>AuthService: Forward request avec deviceId
    AuthService->>AuthService: Récupérer codes de secours utilisateur
    AuthService->>AuthService: Vérifie hash du code et statut (non utilisé)
    
    alt Code de secours valide et non utilisé
        AuthService->>AuthService: Marque code comme utilisé
        AuthService->>AuthService: Génère tokens avec deviceId
        AuthService->>AuthService: Marquer appareil comme vérifié 2FA
        AuthService->>AuthService: Journaliser utilisation dans login_history
        AuthService->>UserService: Notifier utilisation code secours (gRPC over mTLS)
        AuthService-->>Client: 200 OK avec tokens + deviceId
        Client->>User: Accès autorisé à l'application
        
        opt Recommandation sécurité
            Client->>User: Suggère de reconfigurer la 2FA si perte d'accès
            AuthService->>NotificationService: Envoyer alerte sécurité (gRPC over mTLS)
            NotificationService->>NotificationService: Notifier autres appareils de l'utilisation
        end
    else Code de secours invalide ou déjà utilisé
        AuthService-->>Client: 401 Unauthorized avec détails erreur
        Client->>User: Affiche erreur et conseils
    end

4.1 Explication de l’utilisation des codes de secours

Processus de récupération

  1. Option de secours: L’utilisateur sélectionne l’option “Utiliser un code de secours” s’il ne peut pas accéder à son application d’authentification.
  2. Saisie du code: L’utilisateur entre l’un des 10 codes de secours qui lui ont été fournis lors de l’activation.
  3. Validation du code: Le service:
    • Récupère les codes de secours hachés associés à l’utilisateur
    • Compare le hash du code soumis avec les hash stockés
    • Vérifie que le code n’a pas déjà été utilisé
  4. Utilisation à usage unique: Chaque code ne peut être utilisé qu’une seule fois.
  5. Accès accordé avec gestion centralisée: Si le code est valide:
    • L’utilisateur reçoit des tokens d’authentification avec deviceId
    • L’appareil est marqué comme vérifié 2FA dans auth-service
    • L’utilisation est journalisée dans login_history
  6. Notifications de sécurité:
    • L’utilisation est journalisée pour audit
    • Les autres appareils sont notifiés via notification-service
    • Recommandation de reconfigurer la 2FA en cas de perte d’accès

Gestion des codes de secours

  • Les codes sont générés selon un format spécifique (ex: XXXX-XXXX-XXXX) facilitant la lecture
  • Ils sont stockés uniquement sous forme hachée dans la base de données auth-service
  • Chaque code a un indicateur d’utilisation (utilisé/non utilisé)
  • L’utilisation d’un code est journalisée pour des raisons de sécurité

5. Désactivation de la 2FA

sequenceDiagram
    participant User as Utilisateur
    participant Client as Application Client
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    
    User->>Client: Demande désactivation 2FA
    Client->>User: Demande confirmation
    User->>Client: Confirme et saisit code TOTP actuel
    
    Client->>APIGateway: POST /auth/2fa/disable
    APIGateway->>AuthService: Forward request
    AuthService->>AuthService: Récupérer secret TOTP utilisateur
    AuthService->>AuthService: Valide code TOTP
    
    alt Code valide
        AuthService->>AuthService: Efface secret et codes de secours
        AuthService->>AuthService: Retirer exigence 2FA sur tous appareils utilisateur
        AuthService->>UserService: Désactive 2FA dans profil (gRPC over mTLS)
        UserService-->>AuthService: 2FA désactivée côté profil
        
        AuthService->>NotificationService: Notifier désactivation 2FA (gRPC over mTLS)
        NotificationService->>NotificationService: Envoyer notifications sécurité
        NotificationService-->>AuthService: Notifications envoyées
        
        AuthService-->>Client: 204 No Content
        Client->>User: Confirmation de désactivation
    else Code invalide
        AuthService-->>Client: 401 Unauthorized
        Client->>User: Affiche erreur
    end

5.1 Explication de la désactivation

  1. Demande de désactivation: L’utilisateur accède à l’option de désactivation dans les paramètres de sécurité.
  2. Confirmation de sécurité: Pour confirmer son identité, l’utilisateur doit fournir un code TOTP valide de son application d’authentification.
  3. Validation du code: Le système vérifie que le code est correct avant de procéder.
  4. Suppression centralisée des données: Après validation, auth-service:
    • Supprime le secret TOTP associé à l’utilisateur
    • Supprime tous les codes de secours associés
    • Retire l’exigence 2FA sur tous les appareils utilisateur dans sa table devices
    • Met à jour le statut 2FA des appareils
  5. Coordination avec les autres services:
    • Met à jour le statut 2FA de l’utilisateur dans user-service
    • Envoie des notifications de sécurité via notification-service
  6. Confirmation: L’utilisateur reçoit une confirmation que la 2FA a été désactivée.

6. Spécifications techniques

6.1 Algorithme TOTP

  • Standard: RFC 6238 (TOTP) et RFC 4226 (HOTP)
  • Algorithme de hachage: HMAC-SHA1
  • Longueur du code: 6 chiffres
  • Période: 30 secondes
  • Fenêtre de tolérance: ±1 période (permet d’accepter des codes générés 30 secondes avant/après)
  • Secret: 20 octets (160 bits) aléatoires, encodés en Base32

6.2 Codes de secours

  • Nombre: 10 codes
  • Format: Alphanumériques, 12 caractères groupés par 4 (ex: ABCD-EFGH-IJKL)
  • Stockage: Hachés avec bcrypt (facteur de coût 10)
  • Utilisation: Usage unique avec marquage après utilisation

6.3 Sécurité

  • Rate limiting: Maximum 5 tentatives de code 2FA par session
  • Blocage temporaire: 30 minutes après 5 tentatives échouées
  • Journalisation: Toutes les opérations 2FA sont journalisées dans auth-service
  • Notification: L’utilisateur est notifié sur tous ses appareils lors de l’activation/désactivation de la 2FA
  • Communications sécurisées: Toutes les communications inter-services via mTLS automatique (Istio)

6.4 Expérience utilisateur

  • Instructions claires: Guide pas à pas pour l’activation
  • Applications recommandées: Liste d’applications d’authentification compatibles
  • Test de validation: Vérification du code avant finalisation
  • Rappels: Importance de sauvegarder les codes de secours
  • Accessibilité: Option de saisie manuelle du secret si le QR code ne peut être scanné
  • Synchronisation: État 2FA cohérent sur tous les appareils

7. Considérations d’implémentation

7.1 Bibliothèques recommandées

  • Node.js: otplib pour la génération et validation TOTP
  • Frontend: qrcode pour la génération des QR codes
  • Hachage: bcrypt pour les codes de secours
  • gRPC: @nestjs/microservices pour les communications inter-services

7.2 Structure de données

Table users_auth (PostgreSQL - auth-service)

ALTER TABLE users_auth
ADD COLUMN two_factor_secret VARCHAR(255),
ADD COLUMN two_factor_enabled BOOLEAN NOT NULL DEFAULT FALSE;

Table devices (PostgreSQL - auth-service) - Ajout statut 2FA

ALTER TABLE devices
ADD COLUMN requires_2fa BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN last_2fa_verification TIMESTAMP,
ADD COLUMN two_factor_verified BOOLEAN NOT NULL DEFAULT FALSE;

Table backup_codes (PostgreSQL - auth-service)

CREATE TABLE backup_codes (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    code_hash VARCHAR(255) NOT NULL,
    used BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    used_at TIMESTAMP
);
CREATE INDEX idx_backup_codes_user_id ON backup_codes(user_id);

Table users (PostgreSQL - user-service) - Ajout paramètres 2FA

ALTER TABLE users
ADD COLUMN two_factor_enabled BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN two_factor_enabled_at TIMESTAMP,
ADD COLUMN security_notifications_enabled BOOLEAN NOT NULL DEFAULT TRUE;

7.3 Endpoints API

EndpointMéthodeDescriptionServices impliqués
/auth/me/2fa-statusGETObtenir le statut 2FAauth-service → user-service
/auth/2fa/enablePOSTInitier l’activation 2FAauth-service
/auth/2fa/verifyPOSTVérifier code TOTPauth-service → user-service, notification-service
/auth/2fa/disablePOSTDésactiver 2FAauth-service → user-service, notification-service
/auth/2fa/recoveryPOSTUtiliser code de secoursauth-service → user-service, notification-service
/auth/2fa/backup-codesGETObtenir nouveaux codes de secoursauth-service

8. Communication inter-services

8.1 Coordination avec les autres services

La 2FA nécessite une coordination étroite entre les services via Istio Service Mesh :

graph TD
    A[Auth Service] -.->|"Activation 2FA<br/>gRPC over mTLS"| B[User Service]
    A -.->|"Notifications sécurité<br/>gRPC over mTLS"| C[Notification Service]
    B -.->|"Paramètres utilisateur<br/>gRPC over mTLS"| A
    C -.->|"Récupération infos appareils<br/>gRPC over mTLS"| A
    
    D[AuthorizationPolicy] --> A
    D --> B
    D --> C
    
    E[Distributed Tracing] -.-> A
    E -.-> B
    E -.-> C

Types de communications :

  • Activation/Désactivation : auth-service coordonne avec user-service et notification-service
  • Authentification : Vérification du statut 2FA via user-service
  • Gestion des appareils : auth-service gère directement, notifie notification-service
  • Notifications : Alertes de sécurité via notification-service
  • Synchronisation : État 2FA cohérent géré par auth-service

8.2 Gestion des sessions multi-appareils

sequenceDiagram
    participant Device1 as Appareil 1
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    participant Device2 as Appareil 2
    
    Device1->>AuthService: Active 2FA
    AuthService->>AuthService: Marquer tous appareils comme nécessitant 2FA
    AuthService->>UserService: Mise à jour statut 2FA
    AuthService->>NotificationService: Notifier tous appareils
    NotificationService->>Device2: Notification "2FA activée"
    
    Note over Device1,Device2: Prochaine connexion sur Appareil 2
    
    Device2->>AuthService: Tentative connexion
    AuthService->>AuthService: Vérifier statut 2FA requis pour appareil
    AuthService->>UserService: Vérifier statut 2FA utilisateur
    UserService-->>AuthService: 2FA requise
    AuthService-->>Device2: Demande code 2FA

Caractéristiques multi-appareils :

  • Gestion centralisée : auth-service gère le statut 2FA de tous les appareils
  • Synchronisation immédiate : Activation 2FA propagée à tous les appareils
  • Notifications push : Alertes de sécurité en temps réel via notification-service
  • Sessions coordonnées : Tous les appareils requièrent 2FA après activation
  • Journalisation centralisée : Traçabilité complète dans auth-service

8.3 Synchronisation des paramètres 2FA

# AuthorizationPolicy pour communications 2FA
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-2fa-coordination
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: user-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/auth-service"]
  - to:
    - operation:
        methods: ["POST", "PUT", "GET"]
        paths: ["/user.UserService/Update2FAStatus", "/user.UserService/Get2FASettings"]

---
# AuthorizationPolicy pour notification-service vers auth-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: notification-to-auth-devices
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: auth-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/notification-service"]
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/auth.AuthService/GetUserDevices", "/auth.AuthService/GetDevice2FAStatus"]

9. Tests

9.1 Tests unitaires

  • Validation des algorithmes TOTP avec différentes fenêtres temporelles
  • Génération et validation des codes de secours
  • Vérifications des fenêtres de tolérance temporelle
  • Tests des fonctions de hachage et sécurité
  • Gestion du statut 2FA des appareils

9.2 Tests d’intégration

  • Flux complet d’activation/désactivation avec coordination inter-services
  • Scénarios d’authentification avec 2FA entre services
  • Utilisation des codes de secours avec journalisation centralisée
  • Communication gRPC over mTLS entre auth-service et autres services
  • Synchronisation des notifications sur plusieurs appareils
  • Gestion centralisée des appareils avec statut 2FA

9.3 Tests de sécurité

  • Tentatives de contournement du rate limiting
  • Validation des réponses d’erreur sans fuite d’information
  • Vérification de l’expiration des codes temporaires
  • Tests de résistance aux attaques par rejeu
  • Validation des communications mTLS entre services
  • Sécurité de la gestion centralisée des statuts 2FA

10. Considérations opérationnelles

10.1 Monitoring et observabilité

  • Métriques Istio : Latence et taux de succès des communications 2FA inter-services
  • Métriques métier :
    • Taux d’activation/désactivation 2FA
    • Utilisation des codes de secours
    • Tentatives d’authentification 2FA (succès/échec)
    • Performance des validations TOTP
    • Statut 2FA des appareils
  • Tracing distribué : Suivi des opérations 2FA à travers tous les services
  • Alertes : Pics d’utilisation de codes de secours, pannes de synchronisation

10.2 Gestion des pannes

  • Circuit breakers : Protection contre les pannes de user-service ou notification-service
  • Retry policies : Tentatives automatiques pour les opérations de synchronisation
  • Graceful degradation : Mode dégradé si notification-service indisponible
  • Rollback procedures : Procédures de récupération en cas de désynchronisation
  • Centralized state : État 2FA maintenu dans auth-service pour la résilience

10.3 Scalabilité

  • Scaling horizontal : auth-service peut être scalé indépendamment
  • Cache Redis : Mise en cache des secrets TOTP pour les validations fréquentes
  • Load balancing : Répartition automatique de charge via Istio
  • Stateless design : Aucun état persistant en mémoire
  • Optimized queries : Index appropriés sur tables devices pour performance

11. Livrables

11.1 Composants backend

  • TwoFactorModule: Module de gestion TOTP principal (NestJS)
  • BackupCodesModule: Module de gestion des codes de secours
  • 2FADeviceModule: Module de gestion du statut 2FA des appareils
  • 2FAIntegrationModule: Module d’intégration avec user-service et notification-service
  • QRCodeModule: Module de génération de QR codes
  • SecurityNotificationModule: Module de notifications de sécurité

11.2 Composants frontend

  • Écrans d’activation/désactivation 2FA: Interface complète de gestion
  • Affichage QR code: Composant de génération et affichage
  • Saisie code TOTP: Interface de validation des codes
  • Gestion codes de secours: Affichage et conseils de sauvegarde
  • Notifications sécurité: Alertes coordonnées multi-appareils
  • Status 2FA appareils: Interface pour visualiser le statut par appareil

11.3 Documentation

  • Spécification d’implémentation: Guide détaillé pour les développeurs
  • Diagrammes cryptographiques: Illustrations des processus TOTP
  • Documentation API: Reference pour l’intégration avec les autres modules
  • Guide de sécurité: Bonnes pratiques pour la manipulation des secrets
  • Protocoles de vérification: Instructions pour la validation cryptographique
  • Guide utilisateur: Explications des fonctionnalités pour les utilisateurs
  • Procédures de récupération: Instructions en cas de perte d’accès
  • Configurations Istio: Exemples de policies pour la sécurité inter-services
  • Architecture centralisée: Documentation de la gestion centralisée des appareils

Spécification Fonctionnelle - Gestion des Appareils

0. Sommaire

1. Vue d’ensemble

1.1 Objectif

Cette spécification détaille les fonctionnalités de gestion des appareils de l’application Whispr, permettant aux utilisateurs de gérer plusieurs terminaux connectés à leur compte.

Ce module est essentiel pour l’expérience multi-appareils sécurisée et pour le chiffrement de bout en bout, chaque appareil devant être correctement enregistré et disposer des clés cryptographiques appropriées.

La gestion des appareils est centralisée dans le auth-service, qui devient le service principal responsable de toutes les opérations CRUD sur les appareils, de l’authentification, des sessions et des clés cryptographiques.

1.2 Principes clés

  • Centralisation sécurisée: auth-service comme source unique de vérité pour les appareils et l’authentification
  • Transparence: L’utilisateur a une visibilité complète sur tous les appareils connectés à son compte
  • Contrôle: Possibilité de révoquer l’accès à distance pour n’importe quel appareil
  • Sécurité renforcée: Appareils vérifiés et authentifiés individuellement avec gestion des clés intégrée
  • Expérience utilisateur fluide: Synchronisation transparente coordonnée entre services
  • Communications sécurisées: Toutes les interactions via gRPC over mTLS (Istio)
  • Autorité centralisée: auth-service gère authentification, appareils et clés cryptographiques

1.3 Composants fonctionnels

Le système de gestion des appareils comprend cinq processus principaux:

  1. Enregistrement d’appareil: Ajout d’un nouvel appareil au compte utilisateur via auth-service
  2. Gestion des appareils: Visualisation et contrôle des appareils connectés
  3. Déconnexion à distance: Révocation d’accès gérée par auth-service
  4. Synchronisation: Transfert et mise à jour des données coordonnées entre services
  5. Vérification de sécurité: Confirmation de l’identité des appareils pour le E2E

1.4 Architecture des services

graph TD
    A[Client] --> B[API Gateway]
    B --> C[Auth Service]
    B --> D[User Service]
    B --> E[Notification Service]
    
    C -.->|gRPC over mTLS| D
    C -.->|gRPC over mTLS| E
    E -.->|gRPC over mTLS| C
    
    C --> F[(PostgreSQL Auth + Devices)]
    D --> G[(PostgreSQL Users)]
    E --> H[(PostgreSQL Notifications)]
    
    subgraph "Istio Service Mesh"
        C
        D
        E
    end
    
    subgraph "Device Data Distribution"
        F --> I[Table DEVICES complète]
        F --> J[Sessions par appareil]
        F --> K[Clés cryptographiques]
        H --> L[Tokens FCM/APNS cache]
        G --> M[Préférences utilisateur]
    end

Responsabilités pour la gestion des appareils :

  • auth-service: Source de vérité pour appareils, CRUD complet, authentification, sessions, clés cryptographiques
  • notification-service: Cache léger des tokens, notifications push, demande d’infos à auth-service
  • user-service: Paramètres utilisateur liés aux appareils, préférences de synchronisation

Flux de données principaux :

  • Enregistrement : Client → auth-service (gestion directe)
  • Authentification : Client → auth-service (autorité complète)
  • Gestion : Client → auth-service (APIs /auth/devices/*)
  • Notifications : notification-service → auth-service (récupération d’infos)

2. Enregistrement d’un nouvel appareil

2.1 Méthodes d’enregistrement

L’application supporte trois méthodes principales d’ajout d’un nouvel appareil, toutes gérées directement par auth-service :

  1. Enregistrement lors de l’authentification directe : Via le processus standard de vérification par SMS
  2. Authentification par QR code : Méthode privilégiée utilisant un appareil déjà connecté
  3. Enregistrement manuel : Via l’interface de gestion des appareils

2.2 Enregistrement lors de l’authentification directe

sequenceDiagram
    participant User as Utilisateur
    participant NewDevice as Nouvel Appareil
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    participant ExternalSMS as Service SMS
    
    User->>NewDevice: Saisie numéro téléphone + infos appareil
    NewDevice->>APIGateway: POST /auth/login/verify/request
    APIGateway->>AuthService: Forward request
    AuthService->>UserService: Vérifier téléphone (gRPC over mTLS)
    UserService-->>AuthService: Téléphone confirmé
    AuthService->>AuthService: Générer et envoyer code SMS
    AuthService-->>NewDevice: 200 OK (vérification initiée)
    
    User->>NewDevice: Saisie code SMS
    NewDevice->>APIGateway: POST /auth/login/verify/confirm
    APIGateway->>AuthService: Forward request
    AuthService->>AuthService: Vérifier code
    
    alt 2FA Activée
        AuthService-->>NewDevice: 200 OK (2FA requise)
        User->>NewDevice: Saisie code 2FA
        NewDevice->>APIGateway: POST /auth/2fa/verify
        APIGateway->>AuthService: Forward request
        AuthService->>AuthService: Vérifier code 2FA
    end
    
    Note over AuthService: Enregistrement direct de l'appareil
    AuthService->>AuthService: Créer entrée dans table devices
    AuthService->>AuthService: Générer deviceId unique
    AuthService->>AuthService: Stocker métadonnées et clés
    AuthService->>AuthService: Générer tokens JWT avec deviceId
    
    Note over AuthService,NotificationService: Notification des autres services
    AuthService->>NotificationService: NotifyDeviceRegistered (gRPC over mTLS)
    Note over AuthService,NotificationService: deviceId, userId, fcmToken, basic metadata
    NotificationService->>NotificationService: Créer cache token léger
    
    AuthService->>UserService: NotifyDeviceRegistration (gRPC over mTLS)
    UserService->>UserService: Mettre à jour préférences si nécessaire
    
    AuthService-->>NewDevice: 200 OK avec tokens + deviceId
    NotificationService->>NotificationService: Envoyer notification autres appareils

2.3 Authentification par QR code

sequenceDiagram
    participant NewDevice as Nouvel Appareil
    participant AuthDevice as Appareil Authentifié
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    
    NewDevice->>NewDevice: Génère challenge avec métadonnées appareil
    NewDevice->>NewDevice: Affiche QR code
    AuthDevice->>NewDevice: Scan QR code
    AuthDevice->>APIGateway: POST /auth/scan-login
    APIGateway->>AuthService: Forward request
    
    AuthService->>AuthService: Vérifier appareil authentifié (via deviceId)
    AuthService->>AuthService: Valider QR challenge
    
    Note over AuthService: Enregistrement direct du nouvel appareil
    AuthService->>AuthService: Extraire infos appareil du challenge
    AuthService->>AuthService: Créer entrée dans table devices
    AuthService->>AuthService: Générer deviceId unique
    AuthService->>AuthService: Stocker session authentifiée
    
    AuthService->>AuthService: Générer tokens pour nouvel appareil
    AuthService-->>AuthDevice: 200 OK
    AuthDevice-->>NewDevice: Notifier succès
    AuthService-->>NewDevice: 200 OK avec tokens + deviceId
    
    Note over AuthService,NotificationService: Notification des services
    AuthService->>NotificationService: NotifyDeviceRegistered (gRPC over mTLS)
    AuthService->>UserService: NotifyDeviceRegistration (gRPC over mTLS)
    NotificationService->>NotificationService: Notifier tous autres appareils

2.4 Métadonnées d’appareil

Lors de l’enregistrement dans auth-service, les informations suivantes sont collectées:

  • Identifiants :

    • deviceId (UUID généré par auth-service)
    • userId (référence utilisateur auth)
    • deviceFingerprint (empreinte unique calculée côté client)
  • Métadonnées descriptives :

    • Nom de l’appareil : Défini par l’utilisateur ou généré automatiquement
    • Type d’appareil : iOS, Android, Web
    • Modèle d’appareil : Détecté automatiquement (ex: “iPhone 15”, “Pixel 8”)
    • Système d’exploitation : Version détectée automatiquement
    • Version de l’application : Pour compatibility checks
  • Configuration notifications :

    • Token FCM/APNS : Stocké dans auth-service et partagé avec notification-service
    • Préférences de notification : Types de notifications autorisées
  • Données de sécurité :

    • Clé publique de l’appareil : Pour le chiffrement E2E
    • Adresse IP d’enregistrement : Pour la journalisation de sécurité
    • Localisation approximative : Basée sur l’IP (pays/ville)
    • Date d’enregistrement : Horodatage UTC
    • Statut de vérification : Non vérifié par défaut

2.5 Initialisation et synchronisation

Après enregistrement dans auth-service, un nouvel appareil doit :

  1. Recevoir son deviceId : Identifiant unique attribué par auth-service
  2. Configurer les clés cryptographiques : Génération et stockage des clés Signal
  3. Synchroniser les données initiales : Coordination avec user-service pour profil et contacts
  4. Configurer les notifications : Communication du token FCM/APNS à notification-service
  5. Marquer comme actif : Mise à jour du statut dans auth-service

3. Gestion des appareils connectés

3.1 Interface de gestion des appareils

L’application fournit une interface dédiée permettant à l’utilisateur de gérer ses appareils via auth-service :

sequenceDiagram
    participant User as Utilisateur
    participant CurrentDevice as Appareil Actuel
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant NotificationService as Notification Service
    participant UserService as User Service
    
    User->>CurrentDevice: Accès aux paramètres appareils
    CurrentDevice->>APIGateway: GET /auth/devices
    APIGateway->>AuthService: Forward request
    AuthService->>AuthService: Récupérer appareils avec sessions et métadonnées
    AuthService->>AuthService: Enrichir avec données d'activité
    AuthService-->>CurrentDevice: 200 OK avec liste complète
    
    CurrentDevice->>User: Affiche liste des appareils
    
    User->>CurrentDevice: Sélectionne un appareil
    CurrentDevice->>User: Affiche détails et options
    
    alt Renommer l'appareil
        User->>CurrentDevice: Saisit nouveau nom
        CurrentDevice->>APIGateway: PUT /auth/devices/{deviceId}
        APIGateway->>AuthService: Forward request
        AuthService->>AuthService: Mettre à jour métadonnées
        AuthService->>NotificationService: NotifyDeviceUpdated (gRPC over mTLS)
        AuthService-->>CurrentDevice: 200 OK
        CurrentDevice->>User: Confirmation de mise à jour
    end

Fonctionnalités de l’interface :

  • Visualiser tous les appareils : Liste complète avec métadonnées et statut d’activité
  • Détails par appareil : Nom, modèle, dernière activité, statut de session
  • Identifier l’appareil courant : Marquage visuel de l’appareil actuel
  • Renommer les appareils : Modification des noms personnalisés
  • Voir l’historique : Dernières connexions et activités (depuis login_history)
  • Gérer les clés cryptographiques : Statut et régénération des clés Signal
  • Actions de sécurité : Déconnexion, vérification, révocation

3.2 Statut et activité des appareils

Pour chaque appareil, auth-service suit :

  • Statut de connexion : En ligne / Hors ligne / Inconnu (basé sur les sessions actives)
  • Dernière activité : Horodatage de la dernière interaction authentifiée
  • Version de l’application : Pour identifier les appareils nécessitant une mise à jour
  • Santé des clés : État des clés cryptographiques Signal
  • Historique des sessions : Connexions et déconnexions via login_history
  • Statut de vérification : État de vérification des clés d’identité

3.3 Indicateurs de sécurité

L’interface affiche des indicateurs visuels pour :

  • Appareils non vérifiés : Appareils dont les clés n’ont pas été confirmées
  • Activité suspecte : Connexions depuis des localisations inhabituelles
  • Appareils inactifs : Appareils non utilisés depuis longtemps
  • Clés expirées : Appareils nécessitant une rotation des clés cryptographiques
  • Sessions anormales : Patterns de connexion suspects
  • Versions obsolètes : Appareils avec des versions d’application anciennes

4. Déconnexion à distance

4.1 Déconnexion d’un appareil spécifique

sequenceDiagram
    participant User as Utilisateur
    participant CurrentDevice as Appareil Actuel
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant NotificationService as Notification Service
    participant TargetDevice as Appareil Cible
    participant UserService as User Service
    
    User->>CurrentDevice: Sélectionne "Déconnecter l'appareil"
    CurrentDevice->>User: Demande confirmation
    User->>CurrentDevice: Confirme déconnexion
    
    CurrentDevice->>APIGateway: DELETE /auth/devices/{deviceId}
    APIGateway->>AuthService: Forward request
    
    Note over AuthService: Révocation complète dans auth-service
    AuthService->>AuthService: Ajouter tokens à la liste de révocation
    AuthService->>AuthService: Invalider toutes les sessions de l'appareil
    AuthService->>AuthService: Marquer appareil comme inactif
    AuthService->>AuthService: Enregistrer dans login_history
    
    Note over AuthService,NotificationService: Notification des autres services
    AuthService->>NotificationService: NotifyDeviceRevoked (gRPC over mTLS)
    NotificationService->>NotificationService: Invalider cache token
    
    alt Appareil cible est en ligne
        NotificationService->>TargetDevice: Push notification de déconnexion
        TargetDevice->>TargetDevice: Effacer tokens et données locales
        TargetDevice->>User: Afficher écran de connexion
    end
    
    AuthService->>UserService: NotifyDeviceDisconnection (gRPC over mTLS)
    UserService->>UserService: Mettre à jour préférences si nécessaire
    
    AuthService-->>CurrentDevice: 200 OK
    CurrentDevice->>User: Confirmation de déconnexion

4.2 Déconnexion de tous les autres appareils

sequenceDiagram
    participant User as Utilisateur
    participant CurrentDevice as Appareil Actuel
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant NotificationService as Notification Service
    participant OtherDevices as Autres Appareils
    
    User->>CurrentDevice: Sélectionne "Déconnecter tous les autres appareils"
    CurrentDevice->>User: Demande confirmation
    User->>CurrentDevice: Confirme l'action
    
    CurrentDevice->>APIGateway: POST /auth/devices/disconnect-all-except-current
    APIGateway->>AuthService: Forward request avec deviceId courant
    
    Note over AuthService: Révocation massive dans auth-service
    AuthService->>AuthService: Identifier tous autres appareils utilisateur
    AuthService->>AuthService: Révoquer tous tokens sauf appareil courant
    AuthService->>AuthService: Invalider sessions autres appareils
    AuthService->>AuthService: Marquer autres appareils comme inactifs
    
    AuthService->>NotificationService: NotifyMassDeviceRevocation (gRPC over mTLS)
    NotificationService->>NotificationService: Invalider cache tokens
    NotificationService->>OtherDevices: Push notifications de déconnexion
    
    AuthService-->>CurrentDevice: 200 OK
    CurrentDevice->>User: Confirmation de déconnexion massive
    
    OtherDevices->>OtherDevices: Effacer tokens et données sensibles
    OtherDevices->>OtherDevices: Afficher écran de connexion

4.3 Effets de la déconnexion

Lorsqu’un appareil est déconnecté via auth-service :

  1. Actions auth-service :

    • Révocation de tous les tokens d’accès et de rafraîchissement
    • Invalidation des sessions actives dans la base auth
    • Ajout à la liste noire des tokens
    • Marquage de l’appareil comme inactif
    • Enregistrement dans login_history
  2. Coordination avec notification-service :

    • Notification de révocation d’appareil
    • Invalidation du cache de tokens
    • Envoi de notification push si l’appareil est en ligne
  3. Effacement local :

    • L’application efface les tokens et données sensibles sur l’appareil
    • Nettoyage du cache local des clés cryptographiques
  4. Journalisation et audit :

    • L’action est enregistrée dans login_history par auth-service
    • Notification aux autres appareils via notification-service
    • Synchronisation avec user-service pour les préférences

5. Synchronisation entre appareils

5.1 Données synchronisées

La synchronisation est orchestrée par auth-service en coordination avec les autres services :

sequenceDiagram
    participant NewDevice as Nouvel Appareil
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant UserService as User Service
    participant NotificationService as Notification Service
    
    NewDevice->>APIGateway: GET /auth/sync/initial-data
    APIGateway->>AuthService: Forward request
    
    AuthService->>AuthService: Valider device et session
    AuthService->>UserService: GetUserProfile (gRPC over mTLS)
    UserService-->>AuthService: Profil et contacts
    
    AuthService->>UserService: GetUserPreferences (gRPC over mTLS)
    UserService-->>AuthService: Paramètres utilisateur
    
    AuthService->>AuthService: Collecter infos autres appareils
    AuthService->>AuthService: Préparer clés cryptographiques
    
    AuthService-->>NewDevice: 200 OK avec données initiales
    
    loop Synchronisation périodique
        NewDevice->>APIGateway: GET /auth/sync/updates?since={timestamp}
        APIGateway->>AuthService: Forward request
        AuthService->>AuthService: Collecter mises à jour devices
        AuthService->>UserService: GetUpdates (gRPC over mTLS)
        AuthService-->>NewDevice: 200 OK avec mises à jour
    end

Types de données synchronisées :

  • Profil utilisateur : Informations de base du profil (via user-service)
  • Liste de contacts : Contacts de l’utilisateur (via user-service)
  • Paramètres de confidentialité : Préférences de vie privée (via user-service)
  • Liste des appareils : Métadonnées des appareils connectés (auth-service)
  • Clés cryptographiques : Clés Signal et état de vérification (auth-service)
  • Sessions et authentification : État des sessions par appareil (auth-service)

5.2 Stratégies de synchronisation

auth-service utilise plusieurs stratégies :

  1. Synchronisation initiale : Lors de la première connexion d’un appareil
  2. Synchronisation push : Notifications en temps réel via notification-service
  3. Synchronisation pull : Demandes périodiques pour récupérer les mises à jour
  4. Synchronisation à la demande : L’utilisateur peut forcer une synchronisation
  5. Synchronisation événementielle : Déclenchée par des événements spécifiques

5.3 Gestion des conflits

En cas de modifications concurrentes :

  • Règle du dernier écrivain : La dernière modification est généralement prioritaire
  • Résolution par fusion : Pour certains types de données (listes, collections)
  • Notification à l’utilisateur : Pour les conflits nécessitant une intervention manuelle
  • Journalisation : Les conflits sont enregistrés pour analyse et débogage
  • Autorité auth-service : Les conflits d’appareils sont résolus par auth-service

6. Vérification de sécurité entre appareils

6.1 Vérification des clés d’identité

Pour garantir la sécurité des communications E2E, les appareils d’un même utilisateur doivent se vérifier mutuellement via auth-service :

sequenceDiagram
    participant User as Utilisateur
    participant Device1 as Appareil 1
    participant Device2 as Appareil 2
    participant APIGateway as API Gateway
    participant AuthService as Auth Service
    participant NotificationService as Notification Service
    
    User->>Device1: Accède aux paramètres de sécurité
    Device1->>APIGateway: GET /auth/devices/{deviceId}/security-code
    APIGateway->>AuthService: Forward request
    
    AuthService->>AuthService: Récupérer clé d'identité appareil
    AuthService->>AuthService: Générer code de sécurité basé sur clés
    AuthService-->>Device1: 200 OK avec code QR et numérique
    
    User->>Device2: Accède à la vérification d'appareil
    Device2->>Device2: Scanner le QR code ou comparer codes
    
    alt Codes correspondants
        Device2->>APIGateway: POST /auth/devices/{deviceId}/verify
        APIGateway->>AuthService: Forward request
        AuthService->>AuthService: Valider vérification
        AuthService->>AuthService: Marquer appareils comme vérifiés
        AuthService->>AuthService: Mettre à jour statut dans table devices
        
        AuthService->>NotificationService: NotifyDeviceVerified (gRPC over mTLS)
        NotificationService->>NotificationService: Notifier autres appareils
        
        AuthService-->>Device2: 200 OK
        Device2->>User: Confirmation de vérification
    else Codes non correspondants
        Device2->>User: Alerte de discordance
        User->>User: Décision de sécurité
    end

6.2 Codes de sécurité

Un code de sécurité est généré par auth-service basé sur les clés cryptographiques :

  1. Format numérique : Séquence de chiffres facilement comparable (ex: “12-34-56-78-90-12”)
  2. Format QR : Code QR encodant les informations de vérification
  3. Empreinte visuelle : Représentation graphique unique (similaire à Signal)
  4. Basé sur les clés d’identité : Utilise les clés stockées dans auth-service

6.3 États de vérification

Un appareil peut avoir l’un des statuts suivants dans auth-service :

  • Non vérifié : État initial après enregistrement
  • Vérifié : Clés confirmées par l’utilisateur
  • En attente de vérification : Vérification demandée mais non confirmée
  • Rejeté : Appareil explicitement marqué comme non fiable
  • Révoqué : Appareil dont l’accès a été révoqué

7. Aspects techniques

7.1 Structure de données

Table devices (PostgreSQL dans auth-service)

CREATE TABLE devices (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users_auth(id) ON DELETE CASCADE,
    device_name VARCHAR(100) NOT NULL,
    device_type VARCHAR(20) NOT NULL,
    device_fingerprint VARCHAR(255) UNIQUE NOT NULL,
    model VARCHAR(100),
    os_version VARCHAR(50),
    app_version VARCHAR(20),
    fcm_token VARCHAR(255),
    apns_token VARCHAR(255),
    public_key TEXT NOT NULL,
    last_active TIMESTAMP NOT NULL DEFAULT NOW(),
    ip_address VARCHAR(45),
    registration_ip VARCHAR(45),
    is_verified BOOLEAN NOT NULL DEFAULT FALSE,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    verification_status VARCHAR(20) NOT NULL DEFAULT 'unverified',
    security_metadata JSONB DEFAULT '{}',
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_devices_user_id ON devices(user_id);
CREATE INDEX idx_devices_is_active ON devices(is_active);
CREATE INDEX idx_devices_device_fingerprint ON devices(device_fingerprint);
CREATE INDEX idx_devices_last_active ON devices(last_active);
CREATE INDEX idx_devices_verification_status ON devices(verification_status);

Table device_verifications (PostgreSQL dans auth-service)

CREATE TABLE device_verifications (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    verifier_device_id UUID NOT NULL REFERENCES devices(id),
    verified_device_id UUID NOT NULL REFERENCES devices(id),
    verification_status VARCHAR(20) NOT NULL,
    verification_date TIMESTAMP,
    security_code_hash VARCHAR(255),
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
    UNIQUE(verifier_device_id, verified_device_id)
);

CREATE INDEX idx_device_verifications_verifier ON device_verifications(verifier_device_id);
CREATE INDEX idx_device_verifications_verified ON device_verifications(verified_device_id);

Table notification_tokens (PostgreSQL dans notification-service)

-- notification-service: table légère pour cache des tokens
CREATE TABLE notification_tokens (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    device_id UUID NOT NULL, -- Référence vers auth-service.devices
    user_id UUID NOT NULL,   -- Référence vers user-service.users
    fcm_token VARCHAR(255),
    apns_token VARCHAR(255),
    notification_preferences JSONB DEFAULT '{}',
    is_active BOOLEAN DEFAULT TRUE,
    last_sync_at TIMESTAMP DEFAULT NOW(),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_notification_tokens_device_id ON notification_tokens(device_id);
CREATE INDEX idx_notification_tokens_user_id ON notification_tokens(user_id);
CREATE INDEX idx_notification_tokens_is_active ON notification_tokens(is_active);

7.2 Endpoints API

EndpointMéthodeDescriptionService responsable
/auth/devicesGETListe tous les appareils de l’utilisateurauth-service
/auth/devicesPOSTEnregistre un nouvel appareilauth-service
/auth/devices/{deviceId}GETObtient les détails d’un appareilauth-service
/auth/devices/{deviceId}PUTMet à jour les informations d’un appareilauth-service
/auth/devices/{deviceId}DELETEDéconnecte un appareilauth-service
/auth/devices/disconnect-all-except-currentPOSTDéconnecte tous les autres appareilsauth-service
/auth/devices/{deviceId}/security-codeGETObtient le code de sécurité pour vérificationauth-service
/auth/devices/{deviceId}/verifyPOSTMarque un appareil comme vérifiéauth-service
/auth/sync/initial-dataGETRécupère les données initiales pour un nouvel appareilauth-service
/auth/sync/updatesGETRécupère les mises à jour depuis un horodatageauth-service

7.3 Notifications push

notification-service gère les notifications push mais récupère les informations d’appareils depuis auth-service :

  • Connexion d’un nouvel appareil : Alerte de sécurité sur tous les autres appareils
  • Déconnexion à distance : Pour effacer les données locales de l’appareil cible
  • Modification des clés : Pour mettre à jour les clés de chiffrement
  • Changement de statut de vérification : Mise à jour du statut des appareils
  • Forçage de synchronisation : Demande de synchronisation immédiate
  • Alertes de sécurité : Activité suspecte ou tentatives d’accès non autorisées

8. Communication inter-services

8.1 Coordination avec notification-service

graph LR
    A[auth-service] -.->|NotifyDeviceRegistered<br/>gRPC over mTLS| B[notification-service]
    A -.->|NotifyDeviceRevoked<br/>gRPC over mTLS| B
    A -.->|NotifyDeviceUpdated<br/>gRPC over mTLS| B
    
    B -.->|GetDeviceTokens<br/>gRPC over mTLS| A
    B -.->|GetUserDevices<br/>gRPC over mTLS| A

Interactions principales :

  • Notification d’événements : auth-service informe notification-service des changements d’appareils
  • Récupération de tokens : notification-service récupère les informations FCM/APNS depuis auth-service
  • Synchronisation de cache : notification-service maintient un cache léger basé sur auth-service
  • Push notifications : notification-service envoie les notifications avec données d’auth-service

8.2 Synchronisation avec user-service

graph LR
    A[auth-service] -.->|NotifyDeviceRegistration<br/>gRPC over mTLS| B[user-service]
    A -.->|NotifyDeviceDisconnection<br/>gRPC over mTLS| B
    
    B -.->|GetUserProfile<br/>gRPC over mTLS| A
    B -.->|GetUserPreferences<br/>gRPC over mTLS| A
    B -.->|NotifyProfileUpdate<br/>gRPC over mTLS| A

Interactions principales :

  • Données utilisateur : auth-service récupère profil et contacts depuis user-service pour synchronisation
  • Notifications d’événements : auth-service informe user-service des changements d’appareils
  • Préférences : coordination des paramètres utilisateur liés aux appareils
  • Mises à jour de profil : user-service informe auth-service des changements à synchroniser

8.3 Gestion des événements distribuée

# AuthorizationPolicy pour notification-service vers auth-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: notification-to-auth-devices
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: auth-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/notification-service"]
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/auth.AuthService/GetDeviceTokens", "/auth.AuthService/GetUserDevices"]

---
# AuthorizationPolicy pour auth-service vers user-service
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: auth-to-user-sync
  namespace: whispr
spec:
  selector:
    matchLabels:
      app: user-service
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/whispr/sa/auth-service"]
  - to:
    - operation:
        methods: ["GET", "POST"]
        paths: ["/user.UserService/GetProfile", "/user.UserService/GetPreferences", "/user.UserService/NotifyDevice*"]

9. Tests

9.1 Tests unitaires

  • CRUD des appareils dans auth-service
  • Génération et validation des codes de sécurité
  • Logique de synchronisation des données
  • Gestion des clés cryptographiques
  • Validation des métadonnées d’appareil
  • Révocation de tokens et sessions

9.2 Tests d’intégration

  • Enregistrement d’appareil dans auth-service avec notification des autres services
  • Synchronisation complète entre plusieurs appareils via auth-service
  • Processus de vérification croisée avec clés gérées par auth-service
  • Déconnexion à distance et propagation des événements
  • Communication gRPC over mTLS entre tous les services
  • Gestion des pannes de services dépendants

9.3 Tests de sécurité

  • Tentatives d’usurpation d’identité d’appareil
  • Accès non autorisé aux métadonnées d’autres appareils via auth-service
  • Prévention de l’énumération des appareils
  • Tentatives de réutilisation de tokens révoqués
  • Validation des communications mTLS entre services
  • Tests de résistance aux attaques par rejeu

10. Considérations opérationnelles

10.1 Monitoring et observabilité

  • Métriques Istio : Latence et taux de succès des communications inter-services
  • Métriques auth-service :
    • Nombre d’appareils actifs par utilisateur
    • Taux de succès d’enregistrement d’appareils
    • Performance des synchronisations
    • Gestion des clés cryptographiques
    • Performance des révocations de tokens
  • Métriques de coordination :
    • Latence des appels gRPC depuis notification-service et user-service
    • Taux d’échec des opérations distribuées
    • Performance des vérifications de sécurité
  • Tracing distribué : Suivi des opérations à travers tous les services impliqués

10.2 Gestion des pannes

  • Circuit breakers : Protection contre les pannes de notification-service ou user-service
  • Retry policies : Tentatives automatiques pour les opérations inter-services
  • Graceful degradation : Mode dégradé quand services dépendants indisponibles
  • Rollback procedures : Procédures de récupération en cas de désynchronisation
  • Health checks : Vérifications de santé régulières des services

10.3 Scalabilité

  • Scaling horizontal : auth-service peut être scalé indépendamment
  • Load balancing : Répartition automatique de charge via Istio
  • Database sharding : Partitionnement possible par user_id si nécessaire
  • Cache distribué : Redis pour les données fréquemment consultées
  • Optimisation des requêtes : Index appropriés et requêtes optimisées

11. Livrables

11.1 Composants backend

  • DeviceManagementModule : Module principal de gestion des appareils (NestJS dans auth-service)
  • DeviceSyncModule : Module de synchronisation des données (auth-service)
  • DeviceVerificationModule : Module de vérification de sécurité (auth-service)
  • DeviceCoordinationModule : Module de coordination avec notification-service
  • UserSyncModule : Module d’intégration avec user-service
  • CryptographicKeysModule : Gestion des clés Signal intégrée

11.2 Composants frontend

  • Écran de gestion des appareils : Interface listant tous les appareils
  • Écran de détails d’appareil : Informations et options par appareil
  • Module de vérification : Interface de vérification des codes de sécurité
  • Gestionnaire de synchronisation : Logique de synchronisation côté client
  • Moniteur d’état de connexion : Composant affichant l’état des appareils
  • Interface de sécurité : Gestion des clés et vérifications

11.3 Documentation

  • Guide d’implémentation : Instructions pour les développeurs
  • Guide utilisateur : Explications des fonctionnalités pour les utilisateurs
  • Documentation API : Spécifications des endpoints auth-service
  • Diagrammes de séquence : Flux d’interactions détaillés inter-services
  • Procédures de sécurité : Protocoles pour la gestion des incidents
  • Configurations Istio : Exemples de policies pour sécuriser les communications
  • Guide de déploiement : Instructions pour le déploiement coordonné des services

Spécification Fonctionnelle - Chiffrement E2E (Signal Protocol)

1. Vue d’ensemble

1.1 Objectif

Cette spécification détaille l’implémentation du chiffrement de bout en bout (E2E) dans l’application Whispr basé sur le protocole Signal. Le chiffrement E2E garantit que seuls les participants d’une conversation peuvent lire les messages échangés, même si l’infrastructure serveur est compromise. Ce système constitue le fondement de la sécurité et de la confidentialité des communications au sein de l’application.

1.2 Principes fondamentaux

  • Confidentialité de bout en bout: Les messages ne peuvent être déchiffrés que par les destinataires prévus
  • Forward secrecy: La compromission d’une clé ne permet pas de déchiffrer les messages passés
  • Future secrecy: Le système se remet automatiquement d’une compromission potentielle
  • Authentification: Vérification cryptographique des participants à une conversation
  • Deniability: Impossibilité de prouver cryptographiquement qu’un message provient d’un expéditeur spécifique
  • Support multidevices: Fonctionnement cohérent à travers plusieurs appareils d’un même utilisateur gérés par auth-service

1.3 Composants du système

Le système de chiffrement E2E se compose de plusieurs éléments clés:

  1. Double Ratchet Algorithm: Algorithme central de dérivation et rotation des clés
  2. Curve25519: Cryptographie à courbe elliptique pour l’échange de clés Diffie-Hellman
  3. Triple Diffie-Hellman (X3DH): Protocole d’établissement de session initiale
  4. HKDF: Fonction de dérivation de clés basée sur HMAC
  5. AES-256: Chiffrement symétrique des messages
  6. HMAC-SHA256: Authentification des messages
  7. Système de prékeys: Permettant l’établissement asynchrone de sessions, géré par auth-service

2. Architecture du Protocole Signal

2.1 Vue d’ensemble des composants cryptographiques

graph TD
    A[Message en clair] --> B[Protocole Signal]
    
    subgraph "Protocole Signal"
        B --> C[Double Ratchet]
        C --> D[Chiffrement symétrique AES-256]
        C --> E[HMAC-SHA256]
        
        subgraph "Initialisation de session"
            F[X3DH] --> G[Échange de clés Diffie-Hellman]
            G --> H[Curve25519]
        end
        
        I[HKDF] --> C
    end
    
    B --> J[Message chiffré]
    
    K[Prékeys] --> F
    L[Clés d'identité] --> F
    L --> C
    
    subgraph "auth-service"
        M[Gestion des clés par appareil]
        N[Stockage des prékeys]
        O[Identités des appareils]
    end
    
    K --> M
    L --> O

2.2 Types de clés

Le protocole Signal utilise plusieurs types de clés cryptographiques, toutes gérées par auth-service:

  1. Clé d’identité (Identity Key):

    • Paire de clés Curve25519 à long terme
    • Identifie de manière unique un utilisateur ou un appareil
    • La clé privée ne quitte jamais l’appareil
    • La clé publique est stockée et gérée par auth-service
  2. Clés préalables signées (Signed Prekeys):

    • Paires de clés Curve25519 semi-persistantes
    • Générées sur l’appareil et signées avec la clé d’identité
    • Stockées et gérées par auth-service avec la signature
    • Rotation périodique (typiquement tous les 7 jours)
  3. Clés préalables à usage unique (One-Time Prekeys):

    • Paires de clés Curve25519 à usage unique
    • Générées à l’avance en grand nombre (typiquement 100)
    • Stockées et distribuées par auth-service
    • Utilisées une seule fois pour établir une session
    • Supprimées d’auth-service après utilisation
  4. Clés de chaîne (Chain Keys):

    • Clés symétriques dérivées pendant le processus de Double Ratchet
    • Utilisées pour dériver les clés de message
  5. Clés de message (Message Keys):

    • Clés symétriques dérivées des clés de chaîne
    • Utilisées une seule fois pour chiffrer/déchiffrer un message

2.3 Hiérarchie de dérivation des clés

graph TD
    A[Clés d'identité] --> B[Clé partagée initiale]
    C[Clé préalable signée] --> B
    D[Clé préalable à usage unique] --> B
    
    B --> E[Clé racine initiale]
    
    E -->|"Ratchet DH"| F[Nouvelle clé racine]
    E -->|"HKDF"| G[Clé de chaîne d'envoi]
    
    F -->|"Ratchet DH"| H[Clé racine suivante]
    F -->|"HKDF"| I[Clé de chaîne de réception]
    
    G -->|"HKDF"| J[Clé de message d'envoi 1]
    G -->|"HKDF"| K[Clé de chaîne d'envoi suivante]
    K -->|"HKDF"| L[Clé de message d'envoi 2]
    
    I -->|"HKDF"| M[Clé de message de réception 1]
    I -->|"HKDF"| N[Clé de chaîne de réception suivante]
    N -->|"HKDF"| O[Clé de message de réception 2]

3. Établissement de session (X3DH)

3.1 Triple Diffie-Hellman (X3DH)

Le protocole X3DH (Extended Triple Diffie-Hellman) permet d’établir une clé partagée secrète entre deux parties, même lorsque l’une d’elles est hors ligne. Il combine trois échanges Diffie-Hellman distincts pour atteindre cet objectif.

sequenceDiagram
    participant A as Alice (Initiateur)
    participant AuthService as Auth Service
    participant B as Bob (Destinataire)
    
    Note over B,AuthService: Phase préliminaire (Bob est en ligne)
    B->>B: Génère IKb (Clé d'identité)
    B->>B: Génère SPKb (Clé préalable signée)
    B->>B: Génère signature de SPKb avec IKb
    B->>B: Génère OPKs (Clés préalables à usage unique)
    B->>AuthService: Envoie IKb(public), SPKb(public), Signature, OPKs(public)
    AuthService->>AuthService: Stocke les clés publiques de Bob avec deviceId
    
    Note over A,AuthService: Phase d'initiation (Bob peut être hors ligne)
    A->>A: Génère IKa (Clé d'identité)
    A->>A: Génère EKa (Clé éphémère)
    A->>AuthService: Demande les clés publiques de Bob
    AuthService->>AuthService: Récupère clés depuis devices et prékeys tables
    AuthService->>A: Envoie IKb(public), SPKb(public), Signature, OPK(public)
    A->>A: Vérifie la signature de SPKb
    
    A->>A: Calcule DH1 = DH(IKa, SPKb)
    A->>A: Calcule DH2 = DH(EKa, IKb)
    A->>A: Calcule DH3 = DH(EKa, SPKb)
    A->>A: Calcule DH4 = DH(EKa, OPK) (si OPK disponible)
    
    A->>A: SK = KDF(DH1 || DH2 || DH3 || DH4)
    
    A->>AuthService: Envoie message initial chiffré avec SK, IKa(public), EKa(public)
    AuthService->>AuthService: Marque OPK comme utilisée (si utilisée)
    
    Note over B,A: Phase de réception (quand Bob se connecte)
    AuthService->>B: Transmet message initial, IKa(public), EKa(public)
    B->>B: Retrouve OPK utilisée depuis stockage local (si applicable)
    
    B->>B: Calcule DH1 = DH(SPKb, IKa)
    B->>B: Calcule DH2 = DH(IKb, EKa)
    B->>B: Calcule DH3 = DH(SPKb, EKa)
    B->>B: Calcule DH4 = DH(OPK, EKa) (si OPK utilisée)
    
    B->>B: SK = KDF(DH1 || DH2 || DH3 || DH4)
    B->>B: Déchiffre le message avec SK
    B->>B: Initialise Double Ratchet avec SK

3.2 Étapes de l’établissement de session

  1. Phase préliminaire (préparation du destinataire):

    • Le destinataire génère et enregistre ses clés via auth-service
    • Ces clés comprennent sa clé d’identité publique, sa clé préalable signée et ses clés préalables à usage unique
    • auth-service associe les clés aux appareils dans sa table devices
  2. Phase d’initiation (par l’expéditeur):

    • L’expéditeur récupère les clés publiques du destinataire depuis auth-service
    • Il génère une clé éphémère
    • Il calcule une série d’échanges Diffie-Hellman pour dériver une clé partagée
    • Il utilise cette clé pour chiffrer un message initial et l’envoie avec ses clés publiques
  3. Phase de réception (par le destinataire):

    • Le destinataire récupère le message et les clés de l’expéditeur via auth-service
    • Il recalcule la même série d’échanges Diffie-Hellman
    • Il dérive la même clé partagée et déchiffre le message initial
    • Les deux parties disposent maintenant d’un secret partagé pour initialiser l’algorithme Double Ratchet

4. Double Ratchet Algorithm

4.1 Principes fondamentaux

Le Double Ratchet est l’algorithme central du protocole Signal. Il combine:

  1. Ratchet Diffie-Hellman: Échange régulier de nouvelles clés publiques pour renouveler le secret partagé
  2. Ratchet Symétrique: Dérivation progressive de nouvelles clés à partir des secrets partagés

Cette combinaison offre la “forward secrecy” (protection des messages passés) et la “future secrecy” (récupération automatique après compromission).

4.2 Fonctionnement du Double Ratchet

sequenceDiagram
    participant A as Alice
    participant B as Bob
    
    Note over A,B: Clé partagée initiale SK établie via X3DH
    
    A->>A: Initialise clé racine RK = SK
    A->>A: Génère paire DH initiale (DHa)
    A->>B: Envoie clé publique DHa
    
    B->>B: Initialise clé racine RK = SK
    B->>B: Génère paire DH initiale (DHb)
    B->>B: DH Output = DH(DHb, DHa)
    B->>B: (RK, CKs) = KDF(RK, DH Output)
    
    B->>B: Pour chaque message sortant:
    B->>B: MK = KDF(CKs)
    B->>B: CKs = KDF(CKs)
    B->>A: Message chiffré avec MK + clé publique DHb
    
    A->>A: DH Output = DH(DHa, DHb)
    A->>A: (RK, CKr) = KDF(RK, DH Output)
    A->>A: Pour chaque message entrant:
    A->>A: MK = KDF(CKr)
    A->>A: CKr = KDF(CKr)
    A->>A: Déchiffre message avec MK
    
    A->>A: Génère nouvelle paire DH (DHa')
    A->>A: DH Output = DH(DHa', DHb)
    A->>A: (RK, CKs) = KDF(RK, DH Output)
    
    A->>A: Pour chaque message sortant:
    A->>A: MK = KDF(CKs)
    A->>A: CKs = KDF(CKs)
    A->>B: Message chiffré avec MK + clé publique DHa'
    
    B->>B: DH Output = DH(DHb, DHa')
    B->>B: (RK, CKr) = KDF(RK, DH Output)
    B->>B: Pour chaque message entrant:
    B->>B: MK = KDF(CKr)
    B->>B: CKr = KDF(CKr)
    B->>B: Déchiffre message avec MK

4.3 Étapes du processus de Double Ratchet

  1. Initialisation:

    • Les deux parties initialisent leur état avec la clé partagée (SK) établie via X3DH
    • Chaque partie génère une paire de clés Diffie-Hellman initiale
  2. Ratchet de clé Diffie-Hellman:

    • À chaque tour, une nouvelle paire de clés DH est générée
    • Un nouvel échange DH est calculé avec la dernière clé publique du destinataire
    • Ce résultat est utilisé pour dériver une nouvelle clé racine et clé de chaîne
  3. Ratchet de chaîne symétrique:

    • Pour chaque message, une nouvelle clé de message est dérivée de la clé de chaîne
    • La clé de chaîne évolue également à chaque message
    • Chaque message utilise une clé de message unique
  4. Gestion de messages hors séquence:

    • L’algorithme stocke les clés de message précédentes pour un temps limité
    • Cela permet de déchiffrer les messages arrivant dans le désordre
    • Les clés de message sont supprimées après utilisation ou expiration

5. Gestion des clés

5.1 Cycle de vie des clés d’identité

stateDiagram-v2
    [*] --> Génération: Installation de l'application
    Génération --> Enregistrement: Stockage dans auth-service
    Enregistrement --> Utilisation: Première connexion
    Utilisation --> Vérification: Ajout de contact
    Vérification --> Utilisation
    Utilisation --> Renouvellement: Rotation planifiée
    Renouvellement --> Migration: Période de transition
    Migration --> Utilisation: Nouvelle clé active
    Utilisation --> [*]: Suppression de compte
  1. Génération:

    • Créée lors de l’installation de l’application
    • Stockée exclusivement sur l’appareil (clé privée)
    • La clé publique est enregistrée dans auth-service et associée au deviceId
  2. Utilisation:

    • Utilisée pour l’authentification des messages
    • Employée dans l’établissement initial de session (X3DH)
    • Sert à signer les clés préalables
  3. Vérification:

    • Les utilisateurs peuvent vérifier manuellement les clés d’identité via l’interface d’auth-service
    • Cette vérification se fait via des codes de sécurité ou QR codes
    • Marque les clés comme “vérifiées” dans la base auth-service pour plus de sécurité
  4. Renouvellement:

    • Rotation possible mais peu fréquente (par défaut, tous les 12 mois)
    • Nécessite une procédure spéciale en raison de l’impact sur les sessions existantes
    • Coordonnée par auth-service pour tous les appareils
  5. Migration:

    • Période pendant laquelle l’ancienne et la nouvelle clé sont acceptées
    • Avertissement aux contacts sur le changement de clé via auth-service
    • Établissement progressif de nouvelles sessions

5.2 Gestion des clés préalables signées

sequenceDiagram
    participant D as Appareil
    participant AuthService as Auth Service
    
    D->>D: Génère une nouvelle paire de clés préalables signées (SPK)
    D->>D: Signe SPK avec la clé d'identité
    D->>AuthService: Téléverse SPK(public) + signature avec deviceId
    AuthService->>AuthService: Stocke la nouvelle SPK avec horodatage dans signed_prekeys
    
    Note over D,AuthService: Après une période définie (7 jours par défaut)
    
    D->>D: Génère une nouvelle paire SPK'
    D->>D: Signe SPK' avec la clé d'identité
    D->>AuthService: Téléverse SPK'(public) + signature
    AuthService->>AuthService: Conserve SPK pendant période de transition
    AuthService->>AuthService: Marque SPK' comme active
    
    Note over D,AuthService: Après période de transition (1 jour par défaut)
    
    AuthService->>AuthService: Supprime l'ancienne SPK
    D->>D: Conserve SPK privée pour déchiffrer messages en transit
    D->>D: Purge SPK après période de rétention (30 jours)
  1. Cycle de rotation:

    • Nouvelles clés générées régulièrement (typiquement tous les 7 jours)
    • Signées avec la clé d’identité pour authentification
    • Stockées dans auth-service avec leur signature et deviceId
  2. Période de transition:

    • auth-service conserve l’ancienne et la nouvelle clé pendant une période définie
    • Permet aux sessions en cours d’établissement de se compléter
    • Évite les interruptions de service
  3. Rétention de clés privées:

    • L’appareil conserve les clés privées périmées pendant une période définie
    • Nécessaire pour déchiffrer les messages envoyés avec ces clés
    • Purge automatique après la période de rétention

5.3 Gestion des clés préalables à usage unique

sequenceDiagram
    participant D as Appareil
    participant AuthService as Auth Service
    
    D->>D: Génère 100 paires de clés préalables (OPKs)
    D->>AuthService: Téléverse 100 OPKs (clés publiques uniquement) avec deviceId
    AuthService->>AuthService: Stocke les OPKs avec identifiants uniques dans prekeys table
    
    Note over D,AuthService: Lorsqu'un expéditeur établit une nouvelle session
    
    AuthService->>AuthService: Sélectionne et marque une OPK comme utilisée
    AuthService->>AuthService: Fournit l'OPK à l'expéditeur
    
    Note over D,AuthService: Lorsque le nombre d'OPKs disponibles est faible
    
    AuthService->>D: Notification "OPKs faibles" (< 20 disponibles)
    D->>D: Génère 100 nouvelles OPKs
    D->>AuthService: Téléverse les nouvelles OPKs
    AuthService->>AuthService: Ajoute les nouvelles OPKs au pool disponible
  1. Génération par lot:

    • Générées en grands nombres (typiquement 100 à la fois)
    • Seules les clés publiques sont téléversées vers auth-service
    • Les clés privées restent exclusivement sur l’appareil
    • Associées au deviceId dans auth-service
  2. Utilisation unique:

    • Chaque clé est fournie à un seul expéditeur par auth-service
    • Marquée comme utilisée dans la base auth-service
    • Ne peut jamais être réutilisée pour une autre session
  3. Renouvellement:

    • auth-service surveille le nombre de clés disponibles par appareil
    • Demande de nouvelles clés lorsque le stock devient faible
    • L’appareil génère et téléverse de nouvelles clés préalables
  4. Correspondance et stockage:

    • L’appareil doit maintenir une correspondance entre IDs et clés privées
    • Permet de retrouver la clé privée correspondant à la clé publique utilisée
    • Nécessaire pour compléter l’établissement de session X3DH

6. Chiffrement et authentification des messages

6.1 Format des messages chiffrés

+-------------------------------------------------------------------------+
| Version (1 octet) | Type de message (1 octet) | ID destinataire (4 oct) |
+-------------------------------------------------------------------------+
| ID expéditeur (4 oct) | ID clé DH (4 oct) | Itération CH (4 oct)       |
+-------------------------------------------------------------------------+
| Clé publique DH (32 oct) | IV (16 oct) | Longueur contenu (4 oct)      |
+-------------------------------------------------------------------------+
| Contenu chiffré (variable) | Tag d'authentification HMAC (32 oct)      |
+-------------------------------------------------------------------------+
  1. En-tête (non chiffré):

    • Version du protocole
    • Type de message (normal, clé préalable, etc.)
    • Identifiants du destinataire et de l’expéditeur (deviceId depuis auth-service)
    • Informations sur les clés utilisées (index, itérations)
  2. Corps chiffré:

    • Chiffré avec AES-256 en mode CBC ou GCM
    • Vecteur d’initialisation (IV) unique par message
    • Structure interne variable selon le type de message
  3. Authentification:

    • HMAC-SHA256 calculé sur l’ensemble du message
    • Permet de vérifier l’intégrité et l’authenticité
    • Protège contre les altérations et attaques actives

6.2 Processus de chiffrement des messages

graph TD
    A[Message en clair + Métadonnées] --> B{Message initial?}
    
    B -->|Non| C[Utiliser clé de chaîne d'envoi existante]
    B -->|Oui| D[Dériver clé de chaîne initiale]
    
    C --> E[Dériver clé de message unique]
    D --> E
    
    E --> F[Générer IV aléatoire]
    F --> G[Chiffrer contenu avec AES-256]
    G --> H[Calculer HMAC du message complet]
    
    H --> I[Construire message formaté avec deviceId]
    I --> J[Avancer ratchet symétrique]
    
    K[Besoin ratchet DH?] --> |Oui| L[Générer nouvelle paire DH]
    K --> |Non| M[Conserver clé DH actuelle]
    
    L --> N[Inclure nouvelle clé publique DH]
    N --> O[Avancer ratchet DH]
    
    M --> I
    O --> I
    
    I --> P[Message chiffré final]

7. Gestion multi-appareils

7.1 Architecture de sessions multi-appareils

graph TD
    A[User A] --- A1[Device A1]
    A[User A] --- A2[Device A2]
    A[User A] --- A3[Device A3]
    
    B[User B] --- B1[Device B1]
    B[User B] --- B2[Device B2]
    
    A1 -.->|Session 1| B1
    A1 -.->|Session 2| B2
    A2 -.->|Session 3| B1
    A2 -.->|Session 4| B2
    A3 -.->|Session 5| B1
    A3 -.->|Session 6| B2
    
    subgraph "auth-service"
        AS[Devices Management]
        AS --> A1D[Device A1 Keys]
        AS --> A2D[Device A2 Keys]
        AS --> A3D[Device A3 Keys]
        AS --> B1D[Device B1 Keys]
        AS --> B2D[Device B2 Keys]
    end

Le protocole Signal traite chaque paire appareil-appareil comme une session cryptographique distincte, avec auth-service gérant les appareils:

  1. Sessions indépendantes:

    • Chaque appareil d’un utilisateur maintient des sessions distinctes avec chaque appareil de ses contacts
    • Une session est identifiée par une paire (deviceId émetteur, deviceId destinataire) gérée par auth-service
  2. Pas de partage de clés privées:

    • Les clés privées ne sont jamais partagées entre appareils
    • Chaque appareil génère et gère ses propres clés cryptographiques
    • auth-service stocke uniquement les clés publiques avec association aux deviceId
  3. Architecture en fan-out/fan-in:

    • Fan-out: Un message envoyé est chiffré séparément pour chaque appareil du destinataire
    • Fan-in: Les messages reçus de différents appareils d’un même contact sont présentés dans une interface unifiée
    • auth-service coordonne la distribution aux différents appareils

7.2 Synchronisation de messages entre appareils

sequenceDiagram
    participant A1 as Appareil A1
    participant AuthService as Auth Service
    participant A2 as Appareil A2
    participant B1 as Appareil B
    
    A1->>A1: Compose un message pour B
    A1->>A1: Chiffre le message pour B1
    A1->>AuthService: Envoie message chiffré pour B1
    
    A1->>A1: Chiffre une copie du message pour A2
    A1->>AuthService: Envoie copie synchronisée pour A2
    
    AuthService->>AuthService: Route message vers appareils appropriés
    AuthService->>B1: Délivre message à B1
    AuthService->>A2: Délivre copie synchronisée à A2
    
    A2->>A2: Déchiffre la copie synchronisée
    A2->>A2: Marque comme "envoyé depuis autre appareil"
    
    B1->>B1: Déchiffre le message
    B1->>B1: Affiche message de A
  1. Partage des messages:

    • Un appareil envoyant un message chiffre une copie pour chacun de ses propres appareils
    • Cette copie est envoyée via auth-service comme “message de synchronisation”
    • auth-service route les messages vers les appareils appropriés selon les deviceId
    • Permet à tous les appareils d’avoir une vue cohérente des conversations
  2. Chiffrement des copies:

    • Les copies sont chiffrées individuellement comme tout autre message
    • Utilise les sessions Signal établies entre les appareils du même utilisateur
    • Garantit que même auth-service ne peut pas lire les messages synchronisés
  3. Métadonnées spéciales:

    • Les messages synchronisés contiennent des métadonnées indiquant qu’ils sont des copies
    • L’interface utilisateur les présente comme “envoyés depuis un autre appareil”
    • Évite la confusion et les doublons dans l’interface

7.3 Vérification croisée entre appareils

sequenceDiagram
    participant A1 as Appareil 1
    participant A2 as Appareil 2
    participant AuthService as Auth Service
    participant U as Utilisateur
    
    A1->>AuthService: Demande clé d'identité de l'appareil 2
    AuthService->>A1: Retourne clé publique d'identité A2
    A1->>A1: Génère code de sécurité basé sur clé d'identité A2
    
    A2->>AuthService: Demande clé d'identité de l'appareil 1
    AuthService->>A2: Retourne clé publique d'identité A1
    A2->>A2: Génère code de sécurité basé sur clé d'identité A1
    
    A1->>U: Affiche code de sécurité
    A2->>U: Affiche code de sécurité
    
    U->>U: Compare visuellement les codes
    
    alt Codes identiques
        U->>A1: Confirme vérification
        U->>A2: Confirme vérification
        A1->>AuthService: Marque l'appareil 2 comme vérifié
        A2->>AuthService: Marque l'appareil 1 comme vérifié
        AuthService->>AuthService: Met à jour statut de vérification dans devices
    else Codes différents
        U->>U: Détecte problème potentiel de sécurité
        U->>A1: Rejette vérification
        U->>A2: Rejette vérification
    end
  1. Vérification de cohérence:

    • Les appareils d’un même utilisateur doivent présenter les mêmes clés d’identité aux contacts
    • La vérification croisée permet de s’assurer qu’aucun appareil n’a été compromis
    • auth-service fournit les clés publiques pour la vérification
  2. Processus de vérification:

    • Génération de codes de sécurité sur chaque appareil basés sur les clés d’auth-service
    • Comparaison visuelle par l’utilisateur
    • Confirmation ou rejet basé sur la correspondance
  3. Suivi des vérifications:

    • État de vérification stocké dans auth-service (table devices)
    • Interface utilisateur indiquant le statut de vérification de chaque appareil
    • Alertes en cas de changement inattendu de clés

8. Implémentation technique

8.1 Bibliothèques et frameworks

L’implémentation du protocole Signal dans Whispr utilisera:

  1. libsignal-protocol-typescript:

    • Implémentation TypeScript du protocole Signal
    • Adaptation de la bibliothèque officielle pour JavaScript/TypeScript
    • Gestion des primitives cryptographiques et du protocole
  2. Curve25519-XSalsa20-Poly1305:

    • Boîte cryptographique combinant courbe elliptique et chiffrement symétrique
    • Utilisée pour les opérations cryptographiques de base
  3. HKDF-HMAC-SHA256:

    • Fonction de dérivation de clés basée sur HMAC
    • Utilisée pour toutes les dérivations de clés dans le protocole
  4. protobuf.js:

    • Sérialisation et désérialisation efficace des messages
    • Format binaire compact pour la transmission
  5. SQL/IndexedDB:

    • Stockage local des états de sessions et des clés
    • Optimisé pour les recherches et la persistence

8.2 Architecture de l’implémentation

graph TD
    A[Application Whispr] --> B[Couche de messagerie]
    B --> C[Gestionnaire de sessions Signal]
    
    C --> D[Store de sessions]
    C --> E[Store d'identité]
    C --> F[Store de prékeys]
    
    D --> G[(Base de données locale)]
    E --> G
    F --> G
    
    C --> H[Couche de chiffrement]
    H --> I[Double Ratchet]
    H --> J[X3DH]
    H --> K[Cryptographie de base]
    
    I --> K
    J --> K
    
    C --> L[Gestionnaire de messages]
    L --> M[Queue de messages]
    L --> N[Synchronisation]
    
    C --> O[Interface auth-service]
    O --> P[Gestion des clés publiques]
    O --> Q[Gestion des appareils]
    O --> R[Stockage des prékeys]
  1. Couche d’application:

    • Interface avec la logique métier de Whispr
    • Gestion des messages utilisateur et de l’interface
  2. Gestionnaire de sessions Signal:

    • Cœur de l’implémentation du protocole
    • Maintient l’état de toutes les sessions cryptographiques
  3. Couche de stockage:

    • Persistence sécurisée des clés et états de sessions
    • Stockage chiffré avec clé dérivée du code d’accès utilisateur
  4. Couche de chiffrement:

    • Implémentation des algorithmes cryptographiques
    • Double Ratchet, X3DH et primitives associées
  5. Gestionnaire de messages:

    • Traitement des messages entrants et sortants
    • File d’attente pour les messages en échec
    • Synchronisation multi-appareils
  6. Interface auth-service:

    • Communication avec auth-service pour la gestion des clés publiques
    • Synchronisation des informations d’appareils
    • Stockage et récupération des prékeys

8.3 Sécurisation des clés locales

graph TD
    A[Code PIN/Biométrie] --> B[Fonction de dérivation de clé]
    B --> C[Clé de chiffrement de base de données]
    
    D[Clés cryptographiques Signal] --> E{Stockage chiffré}
    C --> E
    
    E --> F[(Base de données locale chiffrée)]
    
    G[Application active] --> H{Déverrouillage}
    A --> H
    
    H -->|Succès| I[Clés en mémoire déchiffrées]
    H -->|Échec| J[Accès refusé]
    
    K[Application en arrière-plan] --> L[Effacement des clés en mémoire]
    
    M[Synchronisation avec auth-service] --> N[Mise à jour clés publiques]
    N --> F
  1. Protection au repos:

    • Les clés privées sont chiffrées dans la base de données locale
    • Utilisation d’une clé dérivée du code PIN ou de la biométrie de l’utilisateur
    • Chiffrement AES-256 avec sel unique par installation
  2. Protection en mémoire:

    • Les clés sont chargées en mémoire uniquement lorsque nécessaire
    • Effacement de la mémoire après utilisation (quand possible)
    • Nettoyage complet lors de la mise en arrière-plan de l’application
  3. Synchronisation sécurisée:

    • Les clés publiques sont synchronisées avec auth-service
    • Les clés privées ne quittent jamais l’appareil
    • Validation des clés publiques reçues d’auth-service
  4. Contre-mesures supplémentaires:

    • Prévention des captures d’écran sur les écrans sensibles
    • Blocage du débogage sur les builds de production
    • Détection des environnements rootés/jailbreakés

9. Tests de sécurité

9.1 Tests unitaires

  • Génération correcte de clés cryptographiques
  • Échanges Diffie-Hellman et dérivation de clés
  • Progression correcte des ratchets (symétrique et DH)
  • Chiffrement et déchiffrement de messages
  • Gestion des messages hors séquence
  • Sérialisation et désérialisation des états de session
  • Interface avec auth-service pour la gestion des clés

9.2 Tests d’intégration

  • Établissement complet de sessions X3DH avec auth-service
  • Échange de messages bidirectionnel
  • Rotation des clés préalables via auth-service
  • Synchronisation multi-appareils avec gestion centralisée des deviceId
  • Gestion des situations d’erreur et récupération

9.3 Tests de sécurité spécifiques

  • Vérification de la forward secrecy (compromission de clés futures)
  • Vérification de la future secrecy (récupération après compromission)
  • Tests de résistance au rejeu (replay attacks)
  • Tests d’interception (MITM)
  • Validation des signatures et authentification
  • Vérification de non-dégradation du protocole
  • Sécurité de l’interface avec auth-service

10. Livrables

10.1 Composants logiciels

  • Module SignalProtocolManager: Implémentation principale du protocole
  • Service de gestion des clés: Génération et rotation des clés avec interface auth-service
  • API de chiffrement: Interface pour les opérations de chiffrement/déchiffrement
  • Base de données sécurisée: Stockage des clés et états de session
  • Module de synchronisation: Gestion de la cohérence multi-appareils avec auth-service
  • Interface auth-service: Module d’intégration avec auth-service pour la gestion des clés publiques

10.2 Documentation

  • Spécification d’implémentation: Guide détaillé pour les développeurs
  • Diagrammes cryptographiques: Illustrations des processus cryptographiques
  • Documentation API: Reference pour l’intégration avec les autres modules
  • Guide de sécurité: Bonnes pratiques pour la manipulation des clés
  • Protocoles de vérification: Instructions pour la validation cryptographique
  • Documentation d’intégration auth-service: Guide pour l’interface avec auth-service

10.3 Configurations et scripts

  • Scripts de test: Validation automatisée des primitives cryptographiques
  • Outils de débogage: Utilitaires pour diagnostiquer les problèmes cryptographiques
  • Outils d’audit: Vérification de la conformité avec le protocole Signal
  • Scripts de migration: Migration des clés vers auth-service

Annexes

A. Glossaire des termes cryptographiques

TermeDescription
DH (Diffie-Hellman)Protocole d’échange de clés permettant à deux parties de générer un secret partagé sur un canal non sécurisé
X3DHExtended Triple Diffie-Hellman - Protocole d’établissement de session asynchrone
HKDFHMAC-based Key Derivation Function - Fonction de dérivation de clés basée sur HMAC
Forward SecrecyPropriété garantissant que la compromission future d’une clé ne permet pas de déchiffrer les messages passés
PreKeyClé préalable permettant l’établissement asynchrone de session, gérée par auth-service
Double RatchetAlgorithme combinant ratchet symétrique et asymétrique pour la dérivation continue de clés
AES-256Advanced Encryption Standard - Algorithme de chiffrement symétrique avec clé de 256 bits
Curve25519Courbe elliptique utilisée pour les opérations de cryptographie asymétrique
DeviceIdIdentifiant unique d’appareil géré par auth-service

B. Matrice de menaces et contrôles

MenaceImpactContrôle
Interception de messagesDivulgation de contenuChiffrement E2E avec AES-256
Compromission de clés à long termeUsurpation d’identitéForward secrecy via Double Ratchet
Attaque par rejeuConfusion, répétition de messagesCompteurs et identifiants uniques par message
Attaque par homme du milieuInterception activeVérification des clés d’identité via auth-service
Compromission d’appareilAccès aux messagesChiffrement local et verrouillage par code
Modification de messagesIntégrité compromiseHMAC-SHA256 sur chaque message
Compromission auth-serviceFuite clés publiquesClés privées restent sur appareils, vérification croisée

C. Références

  • Signal Protocol Specification: https://signal.org/docs/
  • X3DH Key Agreement Protocol: https://signal.org/docs/specifications/x3dh/
  • Double Ratchet Algorithm: https://signal.org/docs/specifications/doubleratchet/
  • OMEMO Multi-End Message and Object Encryption: XEP-0384
  • Forward Secrecy Properties: Trevor Perrin, “The Double Ratchet: Security Notions and Proofs”

Guide de Conversion : De la Spécification Fonctionnelle aux Epics Jira

0. Sommaire

1. Vue d’ensemble du processus

Les documents de spécifications fonctionnelles servent de source de vérité pour créer des epics Jira structurés et exploitables.

Voici comment transformer efficacement une spécification en epic de développement :

graph LR
    A[Spécification Fonctionnelle] --> B[Analyse et Extraction]
    B --> C[Epic Jira Structuré]
    C --> D[User Stories]
    C --> E[Tasks Techniques]
    C --> F[Critères d'Acceptation]

    G[Documentation] -.->|Référence| C
    H[Tests] -.->|Validation| C
    I[Livrables] -.->|Tasks| E
    J[Diagrammes] -.->|Flux| D

Objectifs de cette méthode :

  • Traçabilité complète entre spécifications et développement
  • Cohérence dans la planification et l’exécution
  • Qualité grâce aux critères d’acceptation précis
  • Efficacité via des templates réutilisables

2. Structure d’un Epic Jira basé sur une spécification

2.1 Titre et Description de l’Epic

Format recommandé :

Titre : [Nom du Composant] - [Fonctionnalité Principale]
Exemple : "Auth Service - Processus d'Authentification Multi-Appareils"

Description :
- Objectif : [Extraire de la section "Objectif" de la spécification]
- Périmètre : [Résumer les composants fonctionnels]
- Services impliqués : [Lister les services et leurs responsabilités]
- Lien vers spécification : [URL du document de spécification]

Exemple concret pour l’authentification :

## Epic : Auth Service - Processus d'Authentification Multi-Appareils

### Description
Implémentation du système d'authentification sécurisé permettant aux utilisateurs de se connecter via vérification SMS et de gérer plusieurs appareils avec authentification par QR code.

**Services impliqués :**
- auth-service : Génération de tokens, vérification SMS, coordination QR
- user-service : Vérification des comptes utilisateur
- notification-service : Gestion et enregistrement des appareils

**Spécification de référence :**
[📖 Spécification Authentification](./1_authentication.md)

2.2 Critères d’Acceptation de l’Epic

Transformer les “Mesures de sécurité” et “Règles métier” de la spécification en critères d’acceptation :

⚪️ GIVEN un utilisateur avec un numéro de téléphone valide
   WHEN il demande un code de vérification
   THEN un code à 6 chiffres est généré et envoyé par SMS avec TTL de 15 minutes

⚪️ GIVEN un code de vérification expiré
   WHEN l'utilisateur tente de l'utiliser
   THEN le système retourne une erreur et demande un nouveau code

⚪️ GIVEN 5 tentatives de code incorrect
   WHEN l'utilisateur fait une 6ème tentative
   THEN le compte est temporairement bloqué pour 30 minutes

⚪️ GIVEN un appareil authentifié scannant un QR code
   WHEN l'utilisateur confirme l'ajout du nouvel appareil
   THEN le nouvel appareil reçoit des tokens valides et un deviceId unique

3. Décomposition en User Stories

3.1 Méthode d’extraction des User Stories

  1. Analyser les diagrammes de séquence : Chaque interaction principale devient une user story
  2. Identifier les acteurs : Utilisateur, Admin, Système, Services externes
  3. Extraire les actions : Chaque action significative dans le processus
  4. Regrouper les actions liées : Une user story = un objectif utilisateur complet

3.2 Exemples concrets

À partir de la spécification d’authentification :

🔹 User Story 1 : Demande de code de vérification
   En tant qu'utilisateur souhaitant me connecter,
   Je veux pouvoir demander un code de vérification par SMS,
   Afin de confirmer l'accès à mon numéro de téléphone.

   Critères d'acceptation :
   - [ ] Le numéro de téléphone est validé au format E.164
   - [ ] Un code à 6 chiffres est généré aléatoirement
   - [ ] Le code est envoyé via service SMS externe
   - [ ] TTL de 15 minutes appliqué au code
   - [ ] Rate limiting : max 5 demandes/heure par numéro

🔹 User Story 2 : Validation du code de vérification
   En tant qu'utilisateur ayant reçu un code SMS,
   Je veux pouvoir saisir ce code pour finaliser ma connexion,
   Afin d'accéder à l'application de manière sécurisée.

   Critères d'acceptation :
   - [ ] Le code saisi est comparé au hash stocké
   - [ ] Maximum 5 tentatives autorisées
   - [ ] Blocage temporaire après échecs répétés
   - [ ] Nettoyage automatique des codes expirés

🔹 User Story 3 : Enregistrement automatique d'appareil
   En tant qu'utilisateur me connectant depuis un nouvel appareil,
   Je veux que mon appareil soit automatiquement enregistré,
   Afin de pouvoir recevoir des notifications et accéder aux fonctionnalités.

   Critères d'acceptation :
   - [ ] Communication sécurisée avec notification-service
   - [ ] Métadonnées d'appareil collectées (type, nom, FCM token)
   - [ ] DeviceId unique attribué et inclus dans les tokens
   - [ ] Journalisation de l'événement d'enregistrement

4. Création des Tasks Techniques

4.1 Sources des tasks techniques

  1. Section “Livrables” → Tasks de développement des modules
  2. Diagrammes de séquence → Appels API et intégrations inter-services
  3. Section “Tests” → Tasks de validation et qualité
  4. Section “Considérations opérationnelles” → Tasks DevOps et infrastructure

4.2 Template de task technique

📋 Task : [Service] - [Composant] - [Action spécifique]

**Description :**
Implémentation de [fonctionnalité] selon la spécification [lien].

**Référence spécification :** [Lien vers section spécifique]
**Service concerné :** [auth-service/user-service/notification-service]
**Dépendances :** [Autres tasks ou services requis]

**Critères d'acceptation :**
- [ ] Code implémenté selon la spécification
- [ ] Tests unitaires passent (couverture > 70%)
- [ ] Tests d'intégration avec services dépendants validés
- [ ] Documentation technique mise à jour
- [ ] Politiques de sécurité Istio configurées (si applicable)

**Estimation :** [Story points]
**Labels :** [backend, security, integration]

Exemples de tasks pour l’authentification :

📋 AUTH-TASK-001 : Auth Service - Verification Module - SMS Integration
- Implémenter l'intégration avec service SMS externe (Twilio)
- Gestion des erreurs et retry automatique
- Configuration via variables d'environnement

📋 AUTH-TASK-002 : Auth Service - Token Module - JWT Generation
- Génération de tokens JWT avec deviceId inclus
- Signature ES256 et validation des claims
- Gestion des tokens de rafraîchissement

📋 AUTH-TASK-003 : Integration - Auth to Notification - Device Registration
- Communication gRPC over mTLS vers notification-service
- Enregistrement coordonné des nouveaux appareils
- Gestion des erreurs de communication inter-services

5. Gestion des Dépendances Inter-Services

5.1 Identification des dépendances

À partir des diagrammes de séquence, identifier :

  • Appels gRPC entre services et leur direction
  • Ordre des implémentations (quel service doit être prêt en premier)
  • Données partagées (tables, événements, formats de message)
  • Configurations Istio (AuthorizationPolicies, PeerAuthentication)

5.2 Ordre de développement

Exemple pour l’écosystème d’authentification :

graph TD
    A[user-service base] --> B[notification-service base]
    B --> C[auth-service avec intégrations]

    D[Istio Policies] --> C
    E[Tests d'intégration] --> C

    C --> F[Tests end-to-end]
    F --> G[Documentation API]

Ordre de développement recommandé :

Phase 1 : Services de base

  • user-service : CRUD utilisateurs, vérification des comptes
  • notification-service : CRUD appareils, tokens FCM/APNS

Phase 2 : Intégrations

  • auth-service : Authentification avec appels inter-services
  • Configuration Istio : AuthorizationPolicies et mTLS

Phase 3 : Tests et validation

  • Tests d’intégration inter-services
  • Tests de charge et sécurité
  • Documentation API complète

Dépendances critiques :

  • auth-service dépend de user-service pour vérifier les comptes
  • auth-service dépend de notification-service pour enregistrer les appareils
  • Tous les services nécessitent les configurations Istio pour la sécurité

6. Définition de “Done” (DoD) par Epic

DoD basée sur les spécifications fonctionnelles :

## Definition of Done - Epic Authentification

### ⚪️ Développement
- [ ] Tous les endpoints API spécifiés sont implémentés et documentés
- [ ] Tous les diagrammes de séquence sont respectés et fonctionnels
- [ ] Communications inter-services via gRPC over mTLS opérationnelles
- [ ] Rate limiting et mesures de sécurité implémentées selon spécification
- [ ] Gestion d'erreurs cohérente avec les codes de retour spécifiés

### ⚪️ Tests
- [ ] Tests unitaires : couverture > 70% pour tous les modules
- [ ] Tests d'intégration inter-services passent (auth ↔ user, auth ↔ notification)
- [ ] Tests de sécurité validés selon la matrice de menaces
- [ ] Tests de charge pour les endpoints critiques (vérification SMS)
- [ ] Tests de bout en bout pour tous les flux utilisateur

### ⚪️ Sécurité et Conformité
- [ ] Politiques Istio (AuthorizationPolicy, PeerAuthentication) configurées
- [ ] Audit de sécurité basé sur la matrice de menaces de la spécification
- [ ] Chiffrement des données sensibles (codes, tokens) vérifié
- [ ] Logs de sécurité fonctionnels et conformes RGPD
- [ ] Validation par l'équipe sécurité (David/Tudy)

### ⚪️ Documentation et Déploiement
- [ ] Documentation API (Swagger) générée et à jour
- [ ] Guide d'intégration pour les équipes frontend/mobile
- [ ] Scripts de déploiement automatisés et testés
- [ ] Monitoring et alertes configurés selon les métriques spécifiées
- [ ] Runbooks pour les incidents courants

### ⚪️ Validation Produit
- [ ] Démonstration des flux utilisateur principaux réussie
- [ ] Tests d'acceptance par l'équipe produit
- [ ] Performance conforme aux exigences (< 200ms response time)
- [ ] Tests utilisateur sur tous les scénarios spécifiés
- [ ] Validation de l'expérience utilisateur (UX)

7. Bonnes Pratiques pour le Suivi

7.1 Traçabilité Documentation ↔ Développement

Liens bidirectionnels requis :

  • Epic Jira → Référence explicite vers la spécification fonctionnelle
  • Spécification → Mention de l’epic Jira correspondant en en-tête
  • Pull Request GitHub → Référence automatique vers les user stories Jira
  • Tests automatisés → Vérifient les critères de la spécification
  • Documentation API → Cohérente avec les endpoints spécifiés

Format des références :

  • Dans Jira : “Spec: Nom du document
  • Dans les specs : “Epic Jira: EPIC-123
  • Dans les PRs : “Fixes STORY-456, refs EPIC-123”

7.2 Mise à jour de la documentation

Processus de synchronisation :

  1. Modification de spécification → Mise à jour automatique de l’epic

    • Notification Slack vers l’équipe
    • Review des user stories impactées
    • Adaptation des critères d’acceptation
  2. Changement technique → Update des user stories

    • Impact assessment sur les autres services
    • Mise à jour des dépendances
    • Communication aux équipes concernées
  3. Nouvelle contrainte → Ajout de critère d’acceptation

    • Évaluation de l’impact planning
    • Tests supplémentaires requis
    • Validation par le product owner
  4. Bug découvert → Enrichissement des tests spécifiés

    • Ajout de cas de test manquants
    • Renforcement des critères d’acceptation
    • Documentation du fix dans la spécification

7.3 Communication équipe

Points de synchronisation obligatoires :

Sprint Planning :

  • Révision des spécifications pour les stories sélectionnées
  • Validation des dépendances inter-équipes
  • Estimation basée sur la complexité des spécifications

Daily Stand-up :

  • Blocages liés aux dépendances inter-services
  • Écarts par rapport aux spécifications
  • Besoins de clarification technique

Sprint Review :

  • Démonstration conforme aux critères de la spécification
  • Validation des flux utilisateur spécifiés
  • Feedback pour améliorer les spécifications

Retrospective :

  • Efficacité du processus de conversion spéc → epic
  • Qualité des critères d’acceptation
  • Amélioration de la traçabilité

8. Template d’Epic Jira

## Epic : [Service] - [Fonctionnalité]

### 📋 Description
[Objectif extrait de la section "Objectif" de la spécification]

**Services impliqués :** [Liste avec responsabilités]
**Spécification de référence :** [Lien vers le document]
**Équipe responsable :** [Nom de l'équipe]
**Sprint cible :** [Sprint de livraison prévu]

### 🎯 Objectifs Business
- [ ] [Objectif 1 basé sur les composants fonctionnels]
- [ ] [Objectif 2 extrait des principes clés]
- [ ] [Objectif 3 selon les livrables attendus]

### ⚪️ Critères d'Acceptation Epic
[Transformés des mesures de sécurité et règles métier en format Given/When/Then]

### 🔗 User Stories
- [STORY-123] - [Titre user story 1] - [Points] - [Status]
- [STORY-124] - [Titre user story 2] - [Points] - [Status]
- [STORY-125] - [Titre user story 3] - [Points] - [Status]

### 🛠️ Tasks Techniques Transverses
- [TASK-456] - Configuration Istio AuthorizationPolicies - [2pts]
- [TASK-457] - Mise en place monitoring spécifique - [3pts]
- [TASK-458] - Documentation API et guides d'intégration - [2pts]

### 📊 Métriques de Succès
- **Performance :** Temps de réponse < [Valeur spécification]
- **Fiabilité :** Taux d'erreur < [Valeur spécification]
- **Qualité :** Couverture de tests > 70%
- **Sécurité :** 0 vulnérabilité critique détectée

### 🔒 Exigences de Sécurité
[Mesures de sécurité extraites directement de la spécification]
- Rate limiting configuré selon spécifications
- Communications inter-services via mTLS
- Chiffrement des données sensibles
- Audit et logging de sécurité

### 🏗️ Architecture
[Schéma simplifié des services impliqués]
auth-service ↔ user-service (gRPC over mTLS)
auth-service ↔ notification-service (gRPC over mTLS)

### 📝 Notes et Risques
**Dépendances identifiées :**
- [Service X] doit être prêt avant [Service Y]
- Configuration Istio requise avant les tests d'intégration

**Risques techniques :**
- Complexité de synchronisation inter-services
- Performance des appels gRPC en cascade

**Points d'attention :**
- Validation par l'équipe sécurité obligatoire
- Tests de charge sur les endpoints critiques

9. Outils Recommandés

Pour la conversion et planification :

  • Miro/Lucidchart : Visualiser les dépendances entre user stories et services
  • Confluence : Créer des templates d’epic réutilisables et la documentation
  • Jira Advanced Roadmaps : Planifier les dépendances inter-équipes et inter-services

Pour le développement et suivi :

  • GitHub : Liens automatiques entre PRs et tickets Jira via Smart Commits
  • Slack : Notifications automatiques des mises à jour de spécifications
  • Postman/Insomnia : Collections de tests d’API basées sur les spécifications

Pour la qualité et validation :

  • SonarQube : Analyse de code selon les exigences de qualité spécifiées
  • k6/Artillery : Tests de charge basés sur les métriques de performance
  • OWASP ZAP : Tests de sécurité selon la matrice de menaces

10. Exemples Complets

10.1 Epic Authentification - Exemple Réel

## Epic : AUTH-EPIC-001 - Système d'Authentification Multi-Appareils

### 📋 Description
Implémentation complète du système d'authentification sécurisé permettant l'inscription, la connexion via SMS, et la gestion multi-appareils avec QR code.

**Services impliqués :**
- auth-service : Coordination authentification, tokens JWT, vérification SMS
- user-service : Validation comptes utilisateur, CRUD profils
- notification-service : Gestion appareils, tokens FCM/APNS

**Spécification de référence :** [📖 Authentification Whispr](./1_authentication.md)
**Équipe responsable :** Team Backend Core
**Sprint cible :** Sprint 3-4

### 🎯 Objectifs Business
- [ ] Permettre l'inscription sécurisée via vérification SMS
- [ ] Implémenter la connexion sans mot de passe
- [ ] Supporter l'authentification multi-appareils via QR code
- [ ] Garantir la sécurité par mTLS entre tous les services

### ⚪️ Critères d'Acceptation Epic
```gherkin
⚪️ GIVEN un utilisateur avec un numéro valide
   WHEN il demande un code de vérification
   THEN un code 6 chiffres est envoyé par SMS avec TTL 15min

⚪️ GIVEN un appareil authentifié scannant un QR code valide
   WHEN l'utilisateur confirme l'ajout
   THEN le nouvel appareil reçoit des tokens avec deviceId unique

⚪️ GIVEN 5 tentatives de code incorrect
   WHEN l'utilisateur fait une 6ème tentative
   THEN le compte est bloqué temporairement 30 minutes

### 🔗 User Stories (13 points total)
- [AUTH-STORY-001] - Demande code vérification SMS - [2pts] - [Ready]
- [AUTH-STORY-002] - Validation code et inscription - [3pts] - [In Progress]
- [AUTH-STORY-003] - Connexion utilisateur existant - [2pts] - [Ready]
- [AUTH-STORY-004] - Génération et validation tokens JWT - [3pts] - [Ready]
- [AUTH-STORY-005] - Authentification QR code inter-appareils - [3pts] - [Backlog]

### 🛠️ Tasks Techniques Transverses (7 points total)
- [AUTH-TASK-001] - Configuration Istio mTLS policies - [2pts] - [Todo]
- [AUTH-TASK-002] - Monitoring Prometheus + alertes - [3pts] - [Todo]
- [AUTH-TASK-003] - Documentation API Swagger - [2pts] - [Todo]

### 📊 Métriques de Succès
- **Performance :** < 200ms pour validation SMS
- **Fiabilité :** < 0.1% taux d'erreur
- **Qualité :** > 70% couverture tests
- **Sécurité :** 0 vulnérabilité critique

### 🔒 Exigences de Sécurité
- Rate limiting : 5 SMS/heure par numéro
- Communications gRPC over mTLS (Istio)
- Tokens JWT signés ES256
- Codes SMS hachés en Redis avec TTL

### 📝 Notes et Risques
**Dépendances :** user-service et notification-service doivent être opérationnels
**Risque :** Performance des appels gRPC en cascade pour QR code
**Validation :** Équipe sécurité (David/Tudy/Imane) avant release

Cette approche garantit une transformation systématique et de qualité de vos spécifications fonctionnelles en epics Jira exploitables et traçables.

Authentication Implementation

6. Spécifications techniques

6.1 Formats des codes et tokens

  • Code SMS: 6 chiffres numériques
  • Challenge QR: JWT avec payload spécifique
  • Token d’accès: JWT signé avec ES256, validité 1 heure
  • Token de rafraîchissement: JWT signé avec ES256, validité 30 jours
  • Structure du token d’accès:
    {
      "sub": "7c9e6679-7425-40de-944b-e07fc1f90ae7",  // User ID
      "iat": 1680264000,                            // Issued at
      "exp": 1680267600,                            // Expiration
      "deviceId": "550e8400-e29b-41d4-a716-446655440000",
      "scope": "user",                              // Authorization scope
      "fingerprint": "a1b2c3d4e5f6"                 // Device fingerprint
    }
    

6.2 Gestion des codes SMS

  • Génération: Codes entièrement aléatoires
  • Stockage: Hashés avec bcrypt (facteur de coût 10) dans Redis
  • Validité: 15 minutes
  • Tentatives: Maximum 5 par code avant blocage
  • Rate limiting: Maximum 5 demandes/heure par numéro pour éviter l’abus

6.3 Structure des données

Table users_auth (PostgreSQL dans auth-service)

CREATE TABLE users_auth (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    phone_number VARCHAR(20) NOT NULL UNIQUE,
    two_factor_secret VARCHAR(255),
    two_factor_enabled BOOLEAN NOT NULL DEFAULT FALSE,
    last_authenticated_at TIMESTAMP,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

Table devices (PostgreSQL dans user-service)

CREATE TABLE devices (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    device_name VARCHAR(100) NOT NULL,
    device_type VARCHAR(20) NOT NULL,
    fcm_token VARCHAR(255),
    public_key TEXT NOT NULL,
    last_active TIMESTAMP NOT NULL DEFAULT NOW(),
    ip_address VARCHAR(45),
    is_verified BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

Structures Redis

// Verification codes
Key: verification:{verificationId}
Value: {
  phoneNumber: string,
  hashedCode: string,
  purpose: "registration" | "login" | "recovery",
  attempts: number,
  expiresAt: timestamp
}
TTL: 15 minutes

// Revoked tokens
Key: revoked:{tokenId}
Value: { revokedAt: timestamp }
TTL: configurable based on token validity

6.4 Endpoints API

EndpointMéthodeDescriptionParamètres
/auth/register/verify/requestPOSTDemande vérification pour inscription{ phoneNumber: string }
/auth/register/verify/confirmPOSTConfirme code pour inscription{ verificationId: string, code: string }
/auth/registerPOSTFinalise l’inscription{ verificationId: string, firstName: string, lastName: string, ... }
/auth/login/verify/requestPOSTDemande vérification pour connexion{ phoneNumber: string }
/auth/login/verify/confirmPOSTConfirme code pour connexion{ verificationId: string, code: string }
/auth/loginPOSTFinalise la connexion{ verificationId: string }
/auth/scan-loginPOSTAuthentifie via QR code{ challenge: string, authenticatedDeviceId: string, ... }
/auth/refreshPOSTRafraîchit le token d’accès{ refreshToken: string }
/auth/logoutPOSTDéconnexion-
/auth/devicesGETListe appareils connectés-
/auth/devices/{deviceId}DELETERévoque un appareil-

7. Considérations de sécurité

7.1 Protections implantées

  • Rate limiting: Protection contre les attaques par force brute
  • Hachage: Aucun secret stocké en clair
  • TTL stricts: Expiration automatique des données sensibles temporaires
  • Validation séquentielle: Prévention des sauts d’étapes dans les processus d’authentification
  • TLS 1.3: Communications chiffrées entre client et serveur
  • Signatures JWT: Protection contre la falsification des tokens
  • Révocation: Possibilité d’invalider des tokens compromis

7.2 Journalisation sécurisée

  • Enregistrement de toutes les tentatives d’authentification (réussies ou échouées)
  • Journalisation des ajouts/suppressions d’appareils
  • Masquage des données sensibles dans les logs (numéros partiellement masqués)
  • Horodatage précis pour analyse forensique si nécessaire

7.3 Considérations de confidentialité

  • Minimisation des données collectées
  • Utilisateur informé de l’ajout de nouveaux appareils
  • Option de notification en cas de nouvelle connexion
  • Expiration automatique des sessions inactives

8. Tests

8.1 Tests unitaires

  • Validations des formats de numéros de téléphone (nationaux, internationaux)
  • Génération et vérification des codes SMS
  • Encodage et décodage des tokens JWT
  • Calcul et validation des empreintes d’appareil
  • Logique de hachage et de vérification des codes
  • Gestion des expirations et des TTL

8.2 Tests d’intégration

  • Flux complet d’inscription
  • Flux complet d’authentification (avec et sans 2FA)
  • Authentification par QR code
  • Rafraîchissement des tokens
  • Révocation d’appareil et de session
  • Interaction entre le cache Redis et la base de données

8.3 Tests de sécurité

  • Tentatives de réutilisation de codes de vérification expirés
  • Contournement du processus de vérification
  • Attaques par force brute sur les endpoints
  • Tentatives d’utilisation de tokens révoqués
  • Tentatives de manipulation des JWT
  • Tests de dépassement des limites (rate limiting)
  • Vérification des délais d’expiration

8.4 Tests de charge

  • Simulation de nombreuses demandes d’authentification simultanées
  • Performances lors de pics de connexion (ex: 100 connexions/seconde)
  • Comportement du cache Redis sous charge
  • Tests de résilience lors de latence du service SMS
  • Comportement lors d’indisponibilité temporaire du service utilisateur

9. Livrables

9.1 Composants backend (NestJS)

  • AuthModule: Module principal de gestion de l’authentification
  • VerificationService: Service de gestion des codes de vérification SMS
  • TokenService: Service de gestion des JWT (génération, validation, révocation)
  • DeviceService: Service de gestion des appareils
  • QrAuthService: Service d’authentification par QR code
  • Cache adaptateur: Couche d’abstraction pour l’interaction avec Redis
  • gRPC client: Client pour la communication avec le service utilisateur

9.2 Composants frontend

  • Écran d’inscription: Formulaire et flux d’inscription
  • Écran de connexion: Interface de saisie du numéro et du code
  • Écran de vérification SMS: Saisie du code reçu par SMS
  • Générateur de QR code: Pour l’authentification multi-appareils
  • Scanner de QR code: Pour l’autorisation depuis un appareil existant
  • Gestionnaire de sessions: Interface de gestion des appareils connectés
  • Gestionnaire de tokens: Couche de gestion des tokens côté client

9.3 Documentation

  • Guide d’implémentation: Instructions détaillées pour les développeurs
  • Documentation API: Spécifications OpenAPI complètes
  • Guide de configuration: Instructions de déploiement et configuration
  • Tests postman: Collection de requêtes pour tester manuellement les endpoints
  • Guide de dépannage: Solutions aux problèmes courants d’authentification

9.4 Scripts et utilitaires

  • Migration SQL: Scripts de création et migration de la base de données
  • Scripts de test: Automatisation des tests décrits précédemment
  • Script de benchmark: Pour tester les performances des endpoints
  • Monitoring: Configuration des alertes et métriques spécifiques à l’authentification
  • Utilitaire de génération de certificats: Pour le chiffrement JWT

Plan d’Implémentation - Service d’Authentification (Auth-Service) - Programme ESP

Vue d’ensemble

Ce plan d’implémentation structure le développement du service d’authentification selon le calendrier du programme ESP, avec une phase de P.O.C (fin juin - mi-décembre) suivie d’une phase de développement final MVP (mi-décembre - fin avril). Le service auth est critique car il constitue le socle sécuritaire de l’ensemble de l’application Whispr.

Phase 1 : Proof of Concept (Fin Juin - Mi-Décembre)

🎯 Objectifs de la phase P.O.C

  • Valider l’architecture de sécurité et les choix cryptographiques
  • Prototyper les flux d’authentification critiques
  • Tester l’intégration avec les services SMS externes
  • Évaluer les performances des opérations cryptographiques
  • Valider la faisabilité du protocole Signal E2E
  • Identifier les risques de sécurité majeurs
  • Préparer la keynote ESP POC de mi-décembre

Juillet : Fondations Architecture

Semaines 1-2 : Setup et Architecture de Sécurité

  • Configuration de l’environnement de développement sécurisé
  • Setup du projet NestJS avec TypeScript et modules de sécurité
  • Configuration PostgreSQL + Redis avec chiffrement
  • Architecture des modules d’authentification
  • Setup CI/CD avec tests de sécurité automatisés
  • Configuration des variables d’environnement et secrets

Semaines 3-4 : Modèle de données cryptographiques

  • Implémentation des entités : users_auth, devices, prekeys
  • Configuration TypeORM avec chiffrement des colonnes sensibles
  • Migrations sécurisées avec rotation des clés
  • Tests unitaires sur les opérations cryptographiques
  • Validation des contraintes de sécurité

Août : Authentification Core

Semaines 1-2 : Authentification par téléphone (P.O.C)

Fonctionnalités prioritaires P.O.C

  • Vérification SMS avec service externe (Twilio/Vonage)
  • Génération et validation de codes de vérification
  • Gestion des sessions JWT avec ES256
  • Rate limiting et protection anti-brute force
  • API REST endpoints d’authentification

Semaines 3-4 : Gestion des tokens et sessions (P.O.C)

Fonctionnalités prioritaires P.O.C

  • Architecture tokens d’accès/refresh
  • Gestion de la révocation de tokens
  • Stockage sécurisé des sessions dans Redis
  • Tests d’intégration avec user-service (gRPC)

Septembre : Sécurité Avancée

Semaines 1-2 : Authentification 2FA (P.O.C)

Fonctionnalités prioritaires P.O.C

  • Implémentation TOTP avec RFC 6238
  • Génération QR codes et secrets TOTP
  • Codes de secours avec hachage bcrypt
  • Interface d’activation/désactivation 2FA

Semaines 3-4 : Gestion des appareils (P.O.C)

Fonctionnalités prioritaires P.O.C

  • Enregistrement et authentification d’appareils
  • Authentification par scan QR code
  • Déconnexion à distance d’appareils
  • Synchronisation basique entre appareils

Octobre : Chiffrement E2E - Fondations

Semaines 1-2 : Protocole Signal - Base (P.O.C)

  • Implémentation des primitives cryptographiques
  • Génération et gestion des clés d’identité
  • Système de prekeys (signed prekeys et one-time prekeys)
  • Tests cryptographiques avec vecteurs de test

Semaines 3-4 : X3DH et établissement de session (P.O.C)

  • Implémentation du protocole X3DH simplifié
  • Établissement de sessions de base
  • Tests de communication E2E basiques
  • Validation des concepts cryptographiques

Novembre : Intégration et Perfectionnement

Semaines 1-2 : Double Ratchet - Version P.O.C

  • Implémentation simplifiée du Double Ratchet
  • Forward secrecy de base
  • Tests de robustesse cryptographique
  • Optimisations performances initiales

Semaines 3-4 : Multi-appareil - Concepts (P.O.C)

  • Prototypage de la synchronisation multi-appareils
  • Gestion basique des clés pour multiple devices
  • Tests de faisabilité technique
  • Identification des défis de synchronisation

Décembre (1ère moitié) : Finalisation P.O.C et Keynote

Semaines 1-2 : Tests et Documentation P.O.C

  • Tests de sécurité et pénétration basiques
  • Documentation technique et cryptographique
  • Intégration complète avec user-service
  • Métriques de performance et benchmarks
  • Retour d’expérience et recommandations sécurité

🎯 Keynote ESP – POC (Mi-décembre)

  • Démonstration des flux d’authentification
  • Présentation de l’architecture de sécurité
  • Validation des concepts cryptographiques
  • Métriques de performance
  • Roadmap pour la phase MVP

📊 Livrables Phase P.O.C

  • ⚪️ Architecture de sécurité validée et auditée
  • ⚪️ Prototype fonctionnel des flux d’authentification
  • ⚪️ Tests de sécurité et performance préliminaires
  • ⚪️ Documentation des APIs et protocoles cryptographiques
  • ⚪️ Présentation keynote ESP convaincante
  • ⚪️ Plan détaillé pour la phase MVP

Phase 2 : Développement Final MVP (Mi-Décembre - Fin Avril)

🎯 Objectifs de la phase MVP

  • Implémentation complète et robuste du protocole Signal
  • Sécurisation avancée avec audit de sécurité
  • Performance et scalabilité des opérations cryptographiques
  • Intégration complète avec l’écosystème Whispr
  • Conformité aux standards de sécurité (OWASP, NIST)
  • Préparation pour la keynote ESP finale de mi-mai

Décembre (2ème moitié) - Janvier : Consolidation et Production-Ready

Mi-Décembre - Fin Décembre : Hardening Post-P.O.C

  • Refactoring sécurisé basé sur les apprentissages P.O.C
  • Durcissement de l’architecture de sécurité
  • Mise en place des patterns cryptographiques définitifs
  • Configuration sécurisée des environnements (dev, staging, prod)
  • Audit de sécurité du code existant

Janvier : Authentification - Version Production

Sprint 1 - Production Authentication

Epic: Production-Ready Authentication

Stories:

  • Authentification robuste avec gestion d’erreurs complète
  • Rate limiting avancé par IP/utilisateur/téléphone
  • Logs d’audit et monitoring sécurisé
  • Gestion des cas d’erreur et recovery automatique
  • API complète avec documentation OpenAPI
  • Tests de charge et performance

Février : Sécurité Avancée et Multi-Device

Semaines 1-2 : 2FA Production et Sécurité Avancée

Sprint 2 - Advanced Security Features

Epic: Production 2FA and Security

Stories:

  • Interface utilisateur complète pour 2FA
  • Gestion avancée des codes de secours
  • Support multi-applications d’authentification
  • Recovery flows sécurisés et audités
  • Tests de sécurité approfondis et automatisés

Semaines 3-4 : Gestion Multi-Device Complète

Sprint 3 - Complete Multi-Device Management

Epic: Advanced Multi-Device Support

Stories:

  • Vérification croisée entre appareils robuste
  • Codes de sécurité cryptographiques avancés
  • Gestion complète des appareils compromis
  • Synchronisation sécurisée des métadonnées
  • Dashboard de sécurité utilisateur intuitif

Mars : Chiffrement E2E Complet

Semaines 1-2 : Signal Protocol - Production

Sprint 4 - Complete Signal Protocol

Epic: Production Signal Protocol

Stories:

  • Implémentation complète et optimisée du protocole X3DH
  • Gestion avancée des prekeys avec rotation automatique
  • Établissement asynchrone robuste de sessions
  • Tests cryptographiques exhaustifs
  • Gestion d’erreurs cryptographiques complète

Semaines 3-4 : Double Ratchet Optimisé

Sprint 5 - Optimized Double Ratchet

Epic: Production Double Ratchet

Stories:

  • Implémentation optimisée du Double Ratchet
  • Gestion robuste des messages hors séquence
  • Forward secrecy et future secrecy garanties
  • Optimisations performance pour mobile et web
  • Tests de résistance et robustesse cryptographique

Avril : Performance, Scalabilité et Finalisation

Semaines 1-2 : Performance et Scalabilité

Sprint 6 - Performance & Scalability

Epic: Production Performance

Stories:

  • Optimisations complètes des opérations cryptographiques
  • Cache intelligent et efficace pour les clés
  • Parallélisation des opérations coûteuses
  • Scaling horizontal du service auth
  • Tests de charge et stress complets

Semaines 3-4 : Intégration Finale et Monitoring

Sprint 7 - Final Integration & Monitoring

Epic: Complete Integration

Stories:

  • APIs gRPC robustes avec tous les services
  • Monitoring avancé et alerting intelligent
  • Dashboard opérationnel complet
  • Tests d’intégration end-to-end exhaustifs
  • Documentation complète utilisateur et technique

Fin Avril : Préparation Keynote Finale

  • Finalisation de toutes les fonctionnalités
  • Tests finaux et validation complète
  • Préparation démonstration keynote
  • Métriques finales et benchmarks
  • Documentation de présentation

🎯 Keynote ESP – Final MVP (Mi-Mai)

  • Démonstration complète du produit final
  • Présentation des métriques de performance et sécurité
  • Showcase des fonctionnalités avancées
  • Vision produit et impact
  • Retour d’expérience et lessons learned

📋 Matrice des Dépendances Adaptée

Dépendances Critiques

FonctionnalitéPhaseDépend deRequis pour
Authentification BaseP.O.CServices SMS, RedisKeynote P.O.C, toutes autres fonctionnalités
Gestion SessionsP.O.CAuthentificationuser-service, autres services
2FAP.O.CAuthentification, SessionsSécurité avancée MVP
Gestion AppareilsP.O.CAuthentification, 2FAChiffrement E2E
Protocole SignalP.O.C/MVPGestion Appareilsmessaging-service
Multi-Device CompletMVPProtocole SignalKeynote finale

🛠️ Stack Technique et Outils

Technologies Principales

  • Backend: NestJS + TypeScript
  • Base de données: PostgreSQL 14+ (avec chiffrement)
  • Cache: Redis 7+ (avec HA)
  • Communication: gRPC + REST
  • ORM: TypeORM avec chiffrement des colonnes
  • Cryptographie: libsignal-protocol-typescript, otplib
  • Tests: Jest + Supertest + tests cryptographiques
  • Documentation: OpenAPI/Swagger + documentation cryptographique

Infrastructure et Sécurité

  • Orchestration: Kubernetes (GKE) avec NetworkPolicies
  • CI/CD: GitHub Actions avec tests de sécurité
  • Secrets: Google Secret Manager avec rotation
  • Monitoring: Prometheus + Grafana + alerting sécurité
  • Logging: Loki avec logs d’audit
  • SMS: Twilio/Vonage avec fallback

📊 Métriques de Succès Adaptées

Phase P.O.C (Keynote Mi-Décembre)

  • ⚪️ Architecture de sécurité validée par expert
  • ⚪️ Prototypes cryptographiques fonctionnels
  • ⚪️ Tests de sécurité basiques passants
  • ⚪️ Performance acceptable sur opérations crypto (< 500ms)
  • ⚪️ Intégration services externes validée
  • ⚪️ Démonstration convaincante lors de la keynote

Phase MVP (Keynote Mi-Mai)

  • ⚪️ Couverture de tests > 85% (incluant tests crypto)
  • ⚪️ Temps de réponse authentification < 200ms (99e percentile)
  • ⚪️ Temps de réponse opérations crypto < 300ms
  • ⚪️ Audit de sécurité interne passant
  • ⚪️ Conformité OWASP Top 10
  • ⚪️ Tests de pénétration basiques passants
  • ⚪️ Déploiement staging sécurisé réussi
  • ⚪️ Présentation finale impressionnante

⚠️ Risques et Mitigations Adaptés

Risques Planning Spécifiques ESP

RisqueProbabilitéImpactMitigation
Retard avant keynote P.O.CMoyenneCritiqueBuffer de 1 semaine, scope réduit si nécessaire
Complexité Signal pour MVPÉlevéeÉlevéImplémentation progressive, focus sur core features
Retard avant keynote finaleMoyenneCritiqueJalons intermédiaires, backup plans
Qualité vs timingÉlevéeMoyenPriorisation stricte, scope flexible

Risques Techniques

RisqueProbabilitéImpactMitigation
Performance cryptoMoyenneÉlevéBenchmarking continu, optimisations précoces
Intégration servicesMoyenneÉlevéTests d’intégration continus, mocks robustes
Scalabilité RedisFaibleMoyenConfiguration cluster dès le début

👥 Équipe et Ressources Adaptées

Équipe Core

  • 1 Tech Lead Sécurité (temps plein)
  • 2 Développeurs Backend spécialisés crypto (temps plein)
  • 1 Expert Sécurité/Cryptographie (50% temps)
  • 1 DevSecOps (75% temps)

Support Spécialisé

  • Expert Signal Protocol (consulting ponctuel)
  • Auditeur Sécurité (audit interne)
  • Product Owner (suivi keynotes et démo)

📅 Jalons Clés ESP

DateJalonCritères de succès
Fin AoûtAuth Core P.O.CAuthentification + Sessions + JWT
Fin SeptembreSécurité Avancée P.O.C2FA + Multi-device + QR Auth
Fin NovembreCrypto P.O.C CompletSignal Protocol base + Multi-device concepts
🎯 Mi-DécembreKeynote ESP - P.O.CDémonstration convaincante P.O.C
Fin JanvierProduction AuthAuth + 2FA + Devices en production
Fin MarsE2E CompletSignal Protocol complet + Multi-device robuste
Fin AvrilMVP FinaliséTous services intégrés + Performance optimisée
🎯 Mi-MaiKeynote ESP - Final MVPPrésentation finale impressionnante

🎯 Préparation des Keynotes

Keynote P.O.C (Mi-Décembre)

Objectifs de présentation :

  • Démontrer la faisabilité technique complète
  • Présenter l’architecture de sécurité solide
  • Montrer les performances cryptographiques
  • Convaincre sur la robustesse de l’approche

Éléments de démonstration :

  • Authentification complète par SMS + 2FA
  • Scan QR code entre appareils
  • Chiffrement E2E basique fonctionnel
  • Métriques de performance temps réel

Keynote Finale (Mi-Mai)

Objectifs de présentation :

  • Démontrer le produit final complet
  • Montrer l’impact utilisateur et la valeur
  • Présenter les métriques de performance
  • Vision produit et potentiel commercial

Éléments de démonstration :

  • Expérience utilisateur fluide et sécurisée
  • Synchronisation multi-appareils transparente
  • Tableaux de bord et monitoring en temps réel
  • Comparaison avec solutions existantes

Ce plan d’implémentation est maintenant aligné sur le calendrier du programme ESP, avec des jalons clairs pour les deux keynotes importantes et un focus sur la démonstration de valeur à chaque étape.

4. Documents d’Exploitation

4.1 Runbook Opérationnel

  • Rôle : Guide pour les opérations quotidiennes et gestion d’incidents.
  • Contenu : Procédures de déploiement, monitoring, résolution d’incidents.
  • Format recommandé : Document pratique avec instructions étape par étape.

4.2 Stratégie de Logging et Monitoring

  • Rôle : Documentation du système de logs et alertes.
  • Contenu : Structure des logs, métriques clés, seuils d’alerte, dashboards.
  • Format recommandé : Document technique avec exemples de logs et visualisations.

4.3 Plan de Reprise d’Activité (PRA)

  • Rôle : Procédures en cas de sinistre affectant le service auth.
  • Contenu : Recovery Point Objective (RPO), Recovery Time Objective (RTO), procédures.
  • Format recommandé : Document procédural avec arbres de décision.

5. Documents d’Intégration

5.1 Guide d’Intégration Client

  • Rôle : Instructions pour les équipes front-end et autres services.
  • Contenu : Comment consommer l’API auth correctement, gestion des tokens.
  • Format recommandé : Document avec exemples de code dans différents langages.

5.2 Contrats d’API et SDK

  • Rôle : Définition formelle des interfaces exposées par le service auth.
  • Contenu : Spécifications OpenAPI/Swagger, types partagés, clients générés.
  • Format recommandé : Fichiers OpenAPI YAML avec documentation inline

Auth Service Integration Guide

Overview

This document provides comprehensive integration guidelines for developers working with the Auth Service. The service provides secure authentication, two-factor authentication, device management, and session handling capabilities.

Architecture

Core Components

  • Authentication Service: Handles user registration, login, and token management
  • Verification Service: Manages SMS verification and security codes
  • Device Service: Tracks and manages user devices
  • Token Service: JWT token generation and validation
  • Crypto Service: End-to-end encryption utilities

Database Schema

  • UserAuth: User credentials and authentication data
  • Device: Registered user devices
  • PreKey: Signal protocol pre-keys for encryption
  • SignedPreKey: Signed pre-keys for secure communication
  • IdentityKey: User identity keys
  • BackupCode: Emergency authentication codes
  • LoginHistory: Audit trail of authentication events

API Endpoints

Authentication

POST /auth/register

Register a new user account.

Request Body:

{
  "phoneNumber": "+33123456789",
  "password": "securePassword123",
  "deviceInfo": {
    "name": "iPhone 14",
    "type": "mobile",
    "userAgent": "Mozilla/5.0..."
  }
}

Response:

{
  "message": "Registration initiated",
  "verificationId": "uuid-verification-id"
}

POST /auth/confirm-registration

Confirm user registration with SMS verification code.

Request Body:

{
  "verificationId": "uuid-verification-id",
  "code": "123456"
}

Response:

{
  "user": {
    "id": "uuid",
    "phoneNumber": "+33123456789",
    "isVerified": true
  },
  "tokens": {
    "accessToken": "jwt-access-token",
    "refreshToken": "jwt-refresh-token"
  },
  "device": {
    "id": "device-uuid",
    "name": "iPhone 14"
  }
}

POST /auth/login

Authenticate user credentials.

Request Body:

{
  "phoneNumber": "+33123456789",
  "password": "securePassword123",
  "deviceInfo": {
    "name": "iPhone 14",
    "type": "mobile",
    "userAgent": "Mozilla/5.0..."
  }
}

Response:

{
  "requiresTwoFactor": true,
  "verificationId": "uuid-verification-id",
  "availableMethods": ["sms", "totp"]
}

POST /auth/verify-2fa

Complete two-factor authentication.

Request Body:

{
  "verificationId": "uuid-verification-id",
  "code": "123456",
  "method": "sms"
}

Response:

{
  "user": {
    "id": "uuid",
    "phoneNumber": "+33123456789"
  },
  "tokens": {
    "accessToken": "jwt-access-token",
    "refreshToken": "jwt-refresh-token"
  },
  "device": {
    "id": "device-uuid",
    "name": "iPhone 14"
  }
}

Two-Factor Authentication

POST /auth/setup-2fa

Initialize TOTP two-factor authentication.

Headers:

Authorization: Bearer <access-token>

Response:

{
  "qrCode": "data:image/png;base64,...",
  "secret": "base32-encoded-secret",
  "backupCodes": ["code1", "code2", "code3"]
}

POST /auth/confirm-2fa

Confirm TOTP setup with verification code.

Headers:

Authorization: Bearer <access-token>

Request Body:

{
  "code": "123456"
}

QR Code Authentication

POST /auth/qr/generate

Generate QR code for device authentication.

Headers:

Authorization: Bearer <access-token>

Response:

{
  "qrCode": "data:image/png;base64,...",
  "challengeId": "uuid-challenge-id",
  "expiresAt": "2024-01-01T12:00:00Z"
}

POST /auth/qr/scan

Scan QR code from another device.

Request Body:

{
  "challengeId": "uuid-challenge-id",
  "deviceInfo": {
    "name": "iPad Pro",
    "type": "tablet",
    "userAgent": "Mozilla/5.0..."
  }
}

POST /auth/qr/approve

Approve QR code authentication request.

Headers:

Authorization: Bearer <access-token>

Request Body:

{
  "challengeId": "uuid-challenge-id",
  "approved": true
}

Device Management

GET /devices

Retrieve user devices.

Headers:

Authorization: Bearer <access-token>

Response:

{
  "devices": [
    {
      "id": "device-uuid",
      "name": "iPhone 14",
      "type": "mobile",
      "isActive": true,
      "lastSeen": "2024-01-01T12:00:00Z",
      "isCurrent": true
    }
  ]
}

DELETE /devices/:deviceId

Revoke device access.

Headers:

Authorization: Bearer <access-token>

Authentication Flow

Standard Registration Flow

  1. Client calls POST /auth/register with user credentials
  2. Service sends SMS verification code
  3. Client calls POST /auth/confirm-registration with verification code
  4. Service returns user data, tokens, and device information

Standard Login Flow

  1. Client calls POST /auth/login with credentials
  2. If 2FA is enabled, service returns verification requirement
  3. Client calls POST /auth/verify-2fa with 2FA code
  4. Service returns user data, tokens, and device information

QR Code Authentication Flow

  1. Authenticated device calls POST /auth/qr/generate
  2. New device scans QR code and calls POST /auth/qr/scan
  3. Authenticated device approves via POST /auth/qr/approve
  4. New device receives authentication tokens

Security Considerations

JWT Tokens

  • Access tokens expire in 15 minutes
  • Refresh tokens expire in 7 days
  • Tokens use ECDSA P-256 signing algorithm
  • Include device fingerprinting for security

Rate Limiting

  • Authentication endpoints: 5 requests per minute
  • General API endpoints: 100 requests per minute
  • SMS verification: 3 requests per hour per phone number

Encryption

  • Passwords hashed with bcrypt (12 rounds)
  • Sensitive data encrypted with AES-256-GCM
  • End-to-end encryption keys managed per device

Error Handling

Standard Error Response

{
  "error": {
    "code": "INVALID_CREDENTIALS",
    "message": "Invalid phone number or password",
    "details": {
      "field": "password",
      "reason": "incorrect"
    }
  },
  "timestamp": "2024-01-01T12:00:00Z",
  "path": "/auth/login"
}

Common Error Codes

  • INVALID_CREDENTIALS: Authentication failed
  • VERIFICATION_REQUIRED: SMS or 2FA verification needed
  • VERIFICATION_EXPIRED: Verification code expired
  • VERIFICATION_INVALID: Invalid verification code
  • RATE_LIMIT_EXCEEDED: Too many requests
  • DEVICE_LIMIT_EXCEEDED: Maximum devices reached
  • TWO_FACTOR_REQUIRED: 2FA setup required
  • ACCOUNT_LOCKED: Account temporarily locked

Environment Configuration

Required Environment Variables

# Application
NODE_ENV=production
PORT=3000

# Database
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=auth_user
DB_PASSWORD=secure_password
DB_NAME=auth_service

# Redis Cache
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=redis_password

# JWT Configuration
JWT_PRIVATE_KEY=base64-encoded-private-key
JWT_PUBLIC_KEY=base64-encoded-public-key
JWT_ACCESS_TOKEN_EXPIRY=15m
JWT_REFRESH_TOKEN_EXPIRY=7d

# SMS Service
SMS_PROVIDER=twilio
SMS_API_KEY=your-api-key
SMS_API_SECRET=your-api-secret
SMS_FROM_NUMBER=+1234567890

# Security
BCRYPT_ROUNDS=12
MAX_LOGIN_ATTEMPTS=5
LOCKOUT_TIME=900000

# Two-Factor Authentication
TWO_FACTOR_ISSUER=YourApp
TWO_FACTOR_WINDOW=1

# Device Management
MAX_DEVICES_PER_USER=5
DEVICE_CHALLENGE_EXPIRY=300000

Client Integration Examples

JavaScript/TypeScript

class AuthClient {
  private baseUrl: string;
  private accessToken?: string;

  constructor(baseUrl: string) {
    this.baseUrl = baseUrl;
  }

  async register(phoneNumber: string, password: string, deviceInfo: any) {
    const response = await fetch(`${this.baseUrl}/auth/register`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ phoneNumber, password, deviceInfo })
    });
    return response.json();
  }

  async confirmRegistration(verificationId: string, code: string) {
    const response = await fetch(`${this.baseUrl}/auth/confirm-registration`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ verificationId, code })
    });
    const data = await response.json();
    this.accessToken = data.tokens?.accessToken;
    return data;
  }

  async login(phoneNumber: string, password: string, deviceInfo: any) {
    const response = await fetch(`${this.baseUrl}/auth/login`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ phoneNumber, password, deviceInfo })
    });
    return response.json();
  }

  async verify2FA(verificationId: string, code: string, method: string) {
    const response = await fetch(`${this.baseUrl}/auth/verify-2fa`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ verificationId, code, method })
    });
    const data = await response.json();
    this.accessToken = data.tokens?.accessToken;
    return data;
  }

  async getDevices() {
    const response = await fetch(`${this.baseUrl}/devices`, {
      headers: {
        'Authorization': `Bearer ${this.accessToken}`,
        'Content-Type': 'application/json'
      }
    });
    return response.json();
  }
}

Python

import requests
from typing import Optional, Dict, Any

class AuthClient:
    def __init__(self, base_url: str):
        self.base_url = base_url
        self.access_token: Optional[str] = None

    def register(self, phone_number: str, password: str, device_info: Dict[str, Any]) -> Dict[str, Any]:
        response = requests.post(
            f"{self.base_url}/auth/register",
            json={
                "phoneNumber": phone_number,
                "password": password,
                "deviceInfo": device_info
            }
        )
        return response.json()

    def confirm_registration(self, verification_id: str, code: str) -> Dict[str, Any]:
        response = requests.post(
            f"{self.base_url}/auth/confirm-registration",
            json={
                "verificationId": verification_id,
                "code": code
            }
        )
        data = response.json()
        if "tokens" in data:
            self.access_token = data["tokens"]["accessToken"]
        return data

    def login(self, phone_number: str, password: str, device_info: Dict[str, Any]) -> Dict[str, Any]:
        response = requests.post(
            f"{self.base_url}/auth/login",
            json={
                "phoneNumber": phone_number,
                "password": password,
                "deviceInfo": device_info
            }
        )
        return response.json()

    def verify_2fa(self, verification_id: str, code: str, method: str) -> Dict[str, Any]:
        response = requests.post(
            f"{self.base_url}/auth/verify-2fa",
            json={
                "verificationId": verification_id,
                "code": code,
                "method": method
            }
        )
        data = response.json()
        if "tokens" in data:
            self.access_token = data["tokens"]["accessToken"]
        return data

    def get_devices(self) -> Dict[str, Any]:
        response = requests.get(
            f"{self.base_url}/devices",
            headers={"Authorization": f"Bearer {self.access_token}"}
        )
        return response.json()

Testing

Unit Tests

Run unit tests for all services:

npm run test

End-to-End Tests

Run E2E tests against the full application:

npm run test:e2e

Test Environment Setup

The test environment uses:

  • In-memory SQLite database
  • Mocked SMS service
  • Mocked Redis cache
  • Test JWT keys

Deployment

Docker Deployment

# Build and start services
docker-compose -f docker-compose.prod.yml up -d

# Check service health
curl http://localhost/health

Health Checks

  • /health: Overall service health
  • /health/ready: Readiness probe
  • /health/live: Liveness probe

Monitoring and Logging

Metrics

  • Authentication success/failure rates
  • Token generation and validation metrics
  • Device registration and management events
  • SMS verification success rates

Logging

  • All authentication events are logged
  • Failed login attempts are tracked
  • Device management actions are audited
  • Security events are logged with high priority

Support and Troubleshooting

Common Issues

  1. JWT Token Expired: Refresh tokens using the refresh endpoint
  2. SMS Not Received: Check SMS provider configuration and rate limits
  3. 2FA Setup Failed: Verify TOTP secret generation and QR code display
  4. Device Limit Reached: Remove unused devices before adding new ones

Debug Mode

Enable debug logging:

NODE_ENV=development
LOG_LEVEL=debug

Contact

For technical support and integration assistance, refer to the project documentation or contact DALM1 (development team).

6. Documents de Gouvernance

6.1 Journal des Décisions Techniques (ADR)

  • Rôle : Historique des choix d’architecture significatifs et leur justification.
  • Contenu : Une entrée par décision importante avec contexte, alternatives, conséquences.
  • Format recommandé : Documents numérotés stockés dans le repo git.

6.2 Glossaire et Terminologie

  • Rôle : Définition des termes spécifiques au domaine de l’authentification.
  • Contenu : Termes techniques, acronymes, concepts de sécurité.
  • Format recommandé : Document alphabétique avec définitions précises.

ADR 1: Séparation des responsabilités entre auth-service et user-service

Statut

Accepté

Date

2025-04-11

Contexte

Dans notre architecture microservices pour l’application Whispr, nous devons définir précisément la séparation des responsabilités entre le service d’authentification (auth-service) et le service utilisateur (user-service). Cette décision est particulièrement importante car elle impacte:

  1. La gestion des données utilisateur
  2. L’authentification multi-appareils
  3. L’autonomie et la résilience des services
  4. Les performances des opérations d’authentification fréquentes
  5. La complexité de mise en œuvre du chiffrement E2E

Notre architecture actuelle utilise gRPC pour la communication inter-services et maintient des bases de données PostgreSQL distinctes pour chaque service. Nous utilisons également Redis pour les données temporaires d’authentification.

Décision

Nous avons décidé de mettre en place une dénormalisation contrôlée des données utilisateur entre auth-service et user-service, avec la répartition suivante:

Dans auth-service (PostgreSQL)

  • Table users_auth contenant:

    • id (même UUID que dans user-service)
    • phoneNumber (identifiant unique pour l’authentification)
    • twoFactorSecret (données liées à l’authentification)
    • twoFactorEnabled (flag)
    • lastAuthenticatedAt (horodatage)
    • informations temporelles (createdAt, updatedAt)
  • Tables liées aux appareils et clés cryptographiques:

    • devices
    • prekeys, signed_prekeys, identity_keys
    • backup_codes
    • login_history

Dans user-service (PostgreSQL)

  • Table users contenant:
    • id (même UUID que dans users_auth)
    • phoneNumber
    • firstName, lastName
    • username, biography, profilePicture
    • autres attributs du profil complet
    • paramètres et préférences utilisateur

Dans Redis (auth-service)

  • Codes de vérification temporaires
  • Sessions et tokens
  • Données de rate limiting

Conséquences

Avantages

  1. Autonomie des services: Le service d’authentification peut fonctionner indépendamment sans dépendre constamment du service utilisateur pour les opérations critiques d’authentification.
  2. Performance: Pas besoin d’appels gRPC synchrones pour chaque vérification d’authentification, ce qui améliore les performances et la résilience.
  3. Gestion du découplage: La table users_auth simplifiée dans auth-service permet de découpler les cycles de vie des deux services.
  4. Scalabilité indépendante: Chaque service peut être mis à l’échelle selon ses propres besoins de charge.
  5. Sécurité renforcée: La séparation des données sensibles d’authentification (2FA, historique de connexion) des données de profil utilisateur améliore l’isolation de sécurité.

Inconvénients

  1. Duplication partielle de données: Le numéro de téléphone et l’identifiant utilisateur sont dupliqués dans les deux services.
  2. Synchronisation nécessaire: Des mécanismes de synchronisation doivent être mis en place pour maintenir la cohérence des données partagées (comme lors d’un changement de numéro de téléphone).
  3. Complexité accrue: La gestion de deux sources de vérité partielles augmente la complexité du système.
  4. Risque d’incohérence: Sans mécanismes robustes, les données pourraient devenir incohérentes entre les services.

Solution pour la synchronisation

Pour maintenir la cohérence entre les services:

  1. Création d’utilisateur:

    • auth-service crée d’abord l’entrée dans users_auth
    • Puis un événement est publié pour que user-service crée l’entrée correspondante dans users
  2. Mise à jour du numéro de téléphone:

    • Doit être mise à jour dans les deux services via un pattern de transaction distribuée ou Saga
    • Le processus démarre dans auth-service avec la vérification du nouveau numéro
    • Une fois validé, les deux services sont mis à jour de manière coordonnée
  3. Suppression d’utilisateur:

    • Initiée par user-service, puis propagée à auth-service
    • Ou vice-versa, avec des callbacks de confirmation

Alternatives considérées

Alternative 1: Dépendance totale à user-service

Stocker toutes les données utilisateur uniquement dans user-service et faire des appels gRPC pour chaque opération d’authentification.

  • Avantage: Pas de duplication de données
  • Inconvénient majeur: Couplage fort rendant auth-service inopérant si user-service est indisponible

Alternative 2: Duplication complète

Dupliquer toutes les données utilisateur nécessaires dans les deux services.

  • Avantage: Indépendance totale
  • Inconvénient majeur: Complexité de synchronisation trop élevée et risque accru d’incohérences

Alternative 3: Base de données partagée

Utiliser une seule base de données pour les deux services.

  • Avantage: Pas de problèmes de synchronisation
  • Inconvénient majeur: Couplage au niveau de la persistance, violation du principe d’isolation des microservices

Métriques de succès

  • Temps de réponse des opérations d’authentification < 200ms
  • Disponibilité du service auth > 99,9%, même en cas d’indisponibilité temporaire de user-service
  • Taux d’incohérences de données entre services < 0,01%

Références

Kubernetes Deployment Documentation

Resources

Quel est le rôle d’un Deployment ?

Un deployment Kubernetes est un objet qui permet de gérer le déploiement et la mise à jour d’applications conteneurisées de manière déclarative. Voici ses principales fonctions :

Gestion des Pods Le deployment crée et maintient un nombre spécifié de réplicas de pods identiques. Si un pod échoue ou est supprimé, le deployment en crée automatiquement un nouveau pour maintenir le nombre désiré.

Mises à jour progressives (Rolling Updates) Il permet de mettre à jour une application sans interruption de service. Les anciens pods sont remplacés progressivement par de nouveaux, garantissant qu’un certain nombre reste toujours disponible pendant la transition.

Rollback facilité Si une mise à jour pose problème, le deployment permet de revenir rapidement à une version précédente de l’application en une seule commande.

Scalabilité On peut facilement augmenter ou diminuer le nombre de réplicas d’une application selon les besoins, manuellement ou automatiquement.

État désiré vs état actuel Le deployment maintient constamment l’état de l’application conforme à ce qui est déclaré dans sa configuration. Kubernetes surveille et corrige automatiquement les écarts.

En résumé, le deployment est l’un des objets les plus utilisés dans Kubernetes car il simplifie considérablement la gestion du cycle de vie des applications en production, en automatisant les tâches complexes de déploiement, mise à jour et maintien de la disponibilité.


Pods

Les Pods sont la plus petite unité de computing que vous puissiez créer et gérer sur Kubernetes.

Un Pod (comme dans un pod of whales ou pea pod) est un groupe d’un ou plusieurs conteneurs avec un stockage, des ressources réseau partagées et une spécification de comment exécuter les conteneurs. Le contenu d’un Pod est toujours co-localisé, co-planifié, et s’exécutes dans un contexte partagé. Un Pod modélises un “hôte logique” spécifique à une application: il contient un ou plusieurs conteneurs applicatifs avec un couplage relativement fort. Dans un contexte non-cloud, les applications exécutées sur le même hôte physique ou machine virtuelle sont analogues à des applications cloud exécutées sur le même hôte logique.

Tout comme un conteneur applicatif, un pod peut contenir un conteneur d’initialisation qui s’exécutes pendant le démarrage du Pod. Vous pouvez également injecter des Pods éphémères pour débugger un pod en cours d’exécution.

Qu’est ce qu’un Pod ?

Le contexte partagé d’un pod est un ensemble de namespaces Linux, cgroups et potentiellement d’autres facettes d’isolation - les mêmes chose qui isolent un conteneur. Au sein du contexte d’un Pod, les applications individuelles pourraient avoir d’avantage de sous isolations appliquées.

Un pod est similaire à un ensemble de conteneurs avec un namespace des volumes du système de fichier partagé.

Les pods d’un cluster Kubernetes sont utilisés de deux manières différentes:

  • Les pods exécutent un seul conteneur. Le modèle “un conteneur par pod” est le cas d’usage le plus commun dans Kubernetes; dans ce cas, vous pouvez penser le pod comme un wrapper autour du conteneur; Kubernetes manages le pod plutot que de manager le conteneur directement.

  • Les pods qui exécutent plusieurs conteneurs devant fonctionner ensemble. Un pod peut encapsuler une application composée de plusieurs conteneurs co-localisés. Ces conteneurs forment un seule unité de cohésion.

    Grouper plusieurs conteneurs co-localisés et co-managés dans un seul pod est un cas d’usage relativement avancé. Vous devriez utiliser ce pattern seulement dans des cas spécifiques ou vos conteneurs sont fortement couplés.

    Vous n’avez pas besoin d’exécuter plusieurs conteneurs pour fournir de la réplication (pour la résilience ou la quantité); Si vous avez besoin de plusieurs replicas consultez (Workload Management).


Dimensionnement des Pods

Lors du déploiement d’un application Kubernetes, l’une des considérations clés est le dimensionnement des pods.

Lors du dimensionnement d’un pod Kubernetes, il y a plusieurs facteurs à considérer comme la quantité de CPU, de mémoire RAM et de stockage requis, ainsi que le nombre de conteneurs dans le Pod.

Stratégie de dimensionnement

Pour déterminer les bonnes valeurs la meilleure approche combine plusieurs méthodes:

  1. Profiling en dev/staging: Lancer des tests de charge représentatigs pour observer la consommation réelle (CPU, mémoire, I/O). Des outils comme kubectl top, Prometheus, ou des profilers applicatifs sont essentiels.
  2. Démarrer conservateur puis ajuster: Commencez avec des valeurs modestes basées sur vos observations puis affinez progressivement en production selon les métriques réelles.
  3. Requests vs Limits:
    • Requests: ressources garanties par Kubernetes (utilisée lors du scheduling).
    • Limits: plafond maximal (peut déclencher un throttling CPU ou un out of memory (OOM) kill mémoire)

Utiliser un Pod avec des ressources élevées VS. plusieurs replicas

Allouer des ressources élevées à un seul pod fait perdre plusieurs avantages des replicas:

  • Résilience: Un replica qui crash n’affecte qu’une partie du traffic
  • Déploiements progressifs: Les rollling updates sont plus sûres avec plusieurs replicas
  • Distribution de charge: Plusieurs pods utilisent mieux les ressources du cluster que quelques gros pods.
  • Parallélisme: Plus de replicas améne plus de parallélisme réel, surtout pour les requêtes concurrentes. Même avec beaucoup de CPU dans un pod, une application single-thread ne pourra en profiter pleinement.

Régle générale: Priviliégiez plusieurs petits pods plutot qu’on gros mastodonte.


Comment profiler une application NestJS ?

Le profilage est le processus de compréhension du fonctionnement interne d’une application lors de son exécution, l’usage de la mémoire, les goulots d’étranglement et plus.

Qu’est ce que le profilage ?

Profiler signifies mesurer et analyser les performances de votre application pour identifer les problèmes d’efficaté.

Quand vous profilez une application, vous pouvez:

  • Voir quelles fonctions mettent le plus de temps à s’exécuter
  • Détecter les fuites de mémoire
  • Identifier les services et processus les plus lents
  • Optimiser les ressources avant qu’un problème survienne en production

En bref le profilage est la compréhension de ce qui se passe sous le capot.

Profiler une application NestJS

Dans une application NestJS, vous pouvez profiler en utilisant plusieurs techniques:

  1. Interceptors: Une manière propre de mesurer le temps de traitement des requêtes
  2. Middleware: Capturer le temps de début et de fin des requêtes
  3. Memory tracking: Utilisez process.memoryUsage() pour monitorer la mémoire.
  4. Log monitoring: Enregistrez les temps d’exécution et les erreurs critiques.
  5. Outils externes: Intégrez des plateformes de monitoring professionnelles.

Regardons maintenant les meilleurs outils à utiliser.

Configuration SonarQube pour Auth Service

Secrets GitHub à configurer

Pour le repository auth-service

Aller sur https://github.com/whispr-messenger/auth-service/settings/secrets/actions

  1. SONAR_TOKEN : Token d’authentification SonarQube

    • Généré depuis : https://sonarqube.whispr.epitech-msc2026.me
    • Compte > Security > Generate Tokens
    • Type : Global Analysis Token
    • Nom suggéré : auth-service-github-ci
  2. SONAR_HOST_URL : https://sonarqube.whispr.epitech-msc2026.me ✅ (configuré)

  3. SONAR_PROJECT_KEY : whispr-messenger_auth-service_11813afb-b949-4baf-aa3f-7d12c436cb56 (optionnel, défini dans sonar-project.properties)

Pour l’organisation whispr-messenger (optionnel)

Pour partager ces secrets avec tous les repositories :

# Après avoir configuré les permissions org admin
gh auth refresh -h github.com -s admin:org
gh secret set SONAR_HOST_URL --body "https://sonarqube.whispr.epitech-msc2026.me" --org whispr-messenger
gh secret set SONAR_TOKEN --body "VOTRE_TOKEN" --org whispr-messenger

Configuration du projet SonarQube

  • URL : https://sonarqube.whispr.epitech-msc2026.me
  • Project Key : whispr-messenger_auth-service_11813afb-b949-4baf-aa3f-7d12c436cb56
  • Project Name : Whispr Auth Service
  • Main Branch : main
  • Edition : Community (limitations sur l’analyse des pull requests)

Limitations SonarQube Community Edition

⚠️ Important : SonarQube Community Edition ne supporte que l’analyse de la branche principale.

Fonctionnalités disponibles :

  • ✅ Analyse de la branche principale (main) uniquement
  • ✅ Quality Gates sur main
  • ✅ Code coverage sur main
  • ✅ Détection de bugs et vulnerabilités sur main

Fonctionnalités indisponibles (Developer+ Edition requis) :

  • ❌ Analyse des branches de feature
  • ❌ Comparaison PR avec la branche de base
  • ❌ Commentaires automatiques sur les PR
  • ❌ Analyse différentielle des changements uniquement
  • ❌ Multi-branch analysis

Configuration actuelle :

  • SonarQube s’exécute uniquement quand le code est mergé dans main
  • Les PR sont validées avec les autres outils (linting, tests, build)
  • L’analyse complète de qualité se fait après merge
  • Condition: if: github.ref == 'refs/heads/main'

Vérification

Une fois les secrets configurés, les workflows CI/CD incluront automatiquement :

  • Analyse de qualité de code
  • Couverture de tests
  • Détection de vulnérabilités
  • Quality Gates

Les résultats seront visibles dans :

  • SonarQube : https://sonarqube.whispr.epitech-msc2026.me/dashboard?id=whispr-messenger_auth-service_11813afb-b949-4baf-aa3f-7d12c436cb56
  • GitHub Actions : onglet Actions de votre repository

Discord PR Notifications Setup

Ce guide vous explique comment configurer les notifications Discord pour vos Pull Requests en utilisant l’action GitHub officielle discord-webhook-action.

🎯 Fonctionnalités

Le workflow discord-pr-notifications.yml utilise l’action tsickert/discord-webhook@v7.0.0 pour envoyer des notifications Discord pour :

Pull Requests

  • 🆕 Ouverture d’une nouvelle PR
  • 🔄 Réouverture d’une PR fermée
  • Merge d’une PR
  • Fermeture d’une PR (sans merge)
  • 👀 Marquage comme “ready for review”

Reviews

  • Approbation d’une PR
  • Demande de modifications
  • 💬 Commentaires de review

🚀 Configuration

1. Créer un Webhook Discord

  1. Allez dans votre serveur Discord
  2. Cliquez sur le nom du serveur → Paramètres du serveur
  3. Dans la barre latérale, cliquez sur Intégrations
  4. Cliquez sur WebhooksNouveau Webhook
  5. Configurez le webhook :
    • Nom : GitHub PR Notifications (ou autre)
    • Canal : Sélectionnez le canal où vous voulez recevoir les notifications
    • Avatar : Vous pouvez mettre le logo GitHub ou autre
  6. Cliquez sur Copier l’URL du Webhook

2. Ajouter le Secret GitHub

  1. Allez dans votre repository GitHub
  2. Cliquez sur Settings (Paramètres)
  3. Dans la barre latérale, cliquez sur Secrets and variablesActions
  4. Cliquez sur New repository secret
  5. Créez un secret avec :
    • Name : DISCORD_WEBHOOK_URL
    • Secret : Collez l’URL du webhook Discord que vous avez copiée
  6. Cliquez sur Add secret

3. Tester le Workflow

Une fois le secret configuré, le workflow se déclenchera automatiquement lors de :

  • L’ouverture d’une nouvelle PR
  • La réouverture d’une PR
  • La fermeture/merge d’une PR
  • Le marquage d’une PR comme “ready for review”
  • La soumission d’une review

✨ Avantages de l’Action Discord Webhook

L’action tsickert/discord-webhook@v7.0.0 offre plusieurs avantages :

  • 🔧 Configuration simplifiée : Plus besoin de manipuler JSON manuellement
  • 🛡️ Robustesse : Gestion d’erreurs intégrée et validation des inputs
  • 🎨 Embeds riches : Support natif des embeds Discord avec couleurs, thumbnails, etc.
  • 📱 Responsive : Optimisé pour l’affichage mobile et desktop
  • 🔄 Maintenance : Action activement maintenue avec support Node 20

📋 Format des Notifications

Notification de PR

Les notifications incluent :

  • 🏷️ Titre avec emoji selon l’action (🆕 ouverture, ✅ merge, etc.)
  • 🔗 Lien direct vers la PR
  • 🌿 Branches (source → destination)
  • Auteur avec lien vers le profil
  • 📊 Statistiques de changements (+additions -deletions)
  • 🏷️ Labels de la PR (si présents)
  • 📝 Description de la PR (tronquée à 200 caractères)
  • 🖼️ Avatar de l’auteur en thumbnail
  • Timestamp de création/modification

Notification de Review

Les notifications incluent :

  • 🏷️ Titre avec état de la review (✅ approved, ❌ changes requested, 💬 commented)
  • Lien direct vers la review
  • Reviewer et Auteur avec liens vers les profils
  • 💬 Commentaire de la review (tronqué à 300 caractères)
  • 🖼️ Avatar du reviewer en thumbnail
  • Timestamp de soumission

🎨 Couleurs des Notifications

  • 🆕 Nouvelle PR : Bleu (3447003)
  • 🔄 PR réouverte : Jaune (16776960)
  • PR mergée : Vert (65280)
  • PR fermée : Rouge (16711680)
  • 👀 Ready for review : Bleu (3447003)
  • Review approuvée : Vert (65280)
  • Changements demandés : Rouge (16711680)
  • 💬 Commentaire : Gris (9936031)

🔧 Personnalisation

Modifier les couleurs

Changez les valeurs dans les case statements du workflow :

"opened")
  COLOR="3447003"  # Bleu
  ACTION_EMOJI="🆕"

Ajouter des événements

Modifiez la section on du workflow :

pull_request:
  types: [opened, reopened, closed, ready_for_review, assigned, labeled]

Personnaliser l’apparence

Modifiez les paramètres de l’action Discord :

- name: Send Discord notification
  uses: tsickert/discord-webhook@v7.0.0
  with:
    webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
    username: "Mon Bot GitHub"  # Nom personnalisé
    avatar-url: "https://example.com/custom-avatar.png"  # Avatar personnalisé

Filtrer par labels

Ajoutez une condition pour certains labels uniquement :

if: github.event.pull_request.draft == false && contains(github.event.pull_request.labels.*.name, 'important')

🛠️ Troubleshooting

Le webhook ne fonctionne pas

  1. ✅ Vérifiez que l’URL du webhook Discord est correcte dans les secrets
  2. ✅ Vérifiez que le secret DISCORD_WEBHOOK_URL est bien configuré
  3. ✅ Consultez les logs du workflow dans GitHub Actions
  4. ✅ Testez l’URL du webhook avec curl ou Postman

Les notifications ne s’affichent pas correctement

  1. ✅ Vérifiez que le webhook a les permissions d’écrire dans le canal
  2. ✅ Vérifiez que l’URL du webhook n’a pas expiré
  3. ✅ Vérifiez les limites Discord (embeds, caractères, etc.)

Erreurs dans les workflows

  • Consultez l’onglet “Actions” de votre repository GitHub
  • Les logs détaillés vous indiqueront la cause exacte de l’erreur
  • L’action Discord Webhook fournit des messages d’erreur explicites

Notifications en double

  • Le workflow ignore automatiquement les PRs en mode “draft”
  • Chaque type d’événement déclenche une notification séparée (c’est normal)

📚 Ressources

🏷️ Auto-Labeller Documentation

This directory contains the configuration and scripts for automatically labeling pull requests and issues in the auth-service repository.

📁 Files Overview

Core Configuration Files

  • labeler.yml - Auto-labeller configuration that maps file patterns to labels
  • labels.yml - Complete label definitions with colors and descriptions
  • setup-labels.sh - Script to create/update all labels in the repository
  • workflows/labeler.yml - GitHub Actions workflow for auto-labelling

🚀 Getting Started

1. Set Up Repository Labels

First, create all the labels in your repository:

# Make sure you're in the repository root
cd /path/to/auth-service

# Run the setup script
./.github/setup-labels.sh

Prerequisites:

  • GitHub CLI (gh) must be installed and authenticated
  • You need admin access to the repository

2. Enable Auto-Labelling

The auto-labeller workflow is automatically triggered when:

  • Pull requests are opened, edited, synchronized, or reopened
  • Pull requests are marked as ready for review

No additional setup is required - the workflow will start working immediately after the files are committed.

🏷️ Label Categories

Priority Labels

  • 🔥 priority:high - Critical issues requiring immediate attention
  • priority:medium - Important issues to address soon
  • 📝 priority:low - Nice to have improvements

Size Labels (Automatically Applied)

  • 📏 size:XS - 1-10 lines changed
  • 📏 size:S - 11-100 lines changed
  • 📏 size:M - 101-500 lines changed
  • 📏 size:L - 501-1000 lines changed
  • 📏 size:XL - 1000+ lines changed

Component Labels

Authentication & Security

  • 🔐 auth:core - Core authentication functionality
  • 🎫 auth:tokens - JWT token management
  • 🔒 auth:2fa - Two-factor authentication
  • 📱 auth:devices - Device management
  • 🔑 security:crypto - Cryptography and encryption
  • 🛡️ security:guards - Security guards and middleware
  • ⏱️ security:rate-limit - Rate limiting

Infrastructure & APIs

  • 🗄️ database - Database entities and migrations
  • ⚙️ config - Configuration files
  • 💊 health - Health checks and monitoring
  • 🎮 api:controllers - API controllers
  • 🔗 api:grpc - gRPC services
  • 📋 api:dto - Data Transfer Objects

DevOps

  • 🐳 devops:docker - Docker containers
  • devops:ci-cd - CI/CD workflows
  • 🌐 devops:nginx - Nginx configuration
  • 📜 devops:scripts - Scripts and automation

Documentation

  • 📐 docs:architecture - Architecture documentation
  • 📋 docs:specs - Specifications
  • 🔧 docs:operations - Operational documentation
  • 🔗 docs:integration - Integration guides
  • 📊 docs:governance - Governance and ADRs

🤖 Automated Features

Smart PR Analysis

The labeller workflow automatically:

  1. Analyzes file changes and applies appropriate component labels
  2. Calculates PR size based on lines of code changed
  3. Detects priority level based on critical file modifications
  4. Identifies change types (security, database, testing, etc.)
  5. Suggests reviewers based on affected components
  6. Validates PR format and provides feedback

PR Validation Checklist

The workflow automatically comments on PRs with:

  • ✅ Title format validation (conventional commits)
  • ✅ Description completeness check
  • ⚠️ Breaking change detection
  • ✅ Testing mention verification
  • 📋 Complete review checklist

🎯 Customization

Adding New Labels

  1. Update labeler.yml to add file pattern mappings
  2. Update labels.yml to define the new label
  3. Update setup-labels.sh to include the new label creation
  4. Run the setup script to create the new label

Example addition to labeler.yml:

'🎨 ui:components':
  - 'src/components/**/*'
  - 'src/ui/**/*'

Modifying Auto-Assignment Rules

Edit the workflows/labeler.yml file to customize:

  • Priority detection logic in the “Analyze PR Impact” step
  • Reviewer assignment rules in the “Auto-assign Reviewers” step
  • Validation criteria in the “PR Checklist Validation” step

File Pattern Examples

The labeler.yml supports various pattern matching:

# Exact file matches
'🔐 auth:core':
  - 'src/services/auth.service.ts'

# Directory patterns
'🗄️ database':
  - 'src/entities/**/*'
  - 'src/migrations/**/*'

# Wildcard patterns
'🧪 tests:unit':
  - '**/*.spec.ts'

# Multiple conditions (any match)
'🔑 security:crypto':
  - any: ['**/*crypto*.ts', '**/*encryption*.ts']

🔧 Troubleshooting

Labels Not Being Applied

  1. Check workflow permissions - Ensure the workflow has pull-requests: write permission
  2. Verify file patterns - Test your patterns against actual file paths
  3. Check workflow logs - Look at the Actions tab for error messages

Setup Script Issues

  1. GitHub CLI authentication:

    gh auth status
    gh auth login  # if not authenticated
    
  2. Repository access:

    gh repo view  # should show current repository
    

Performance Considerations

  • The workflow runs on every PR update
  • Large PRs (1000+ lines) may take longer to analyze
  • Consider using draft PRs for work-in-progress to avoid unnecessary runs

📊 Analytics and Reporting

You can use GitHub’s insights to track:

  • Label usage statistics - See which components are most active
  • PR review times by label category
  • Team workload distribution based on auto-assigned reviewers

🤝 Contributing

When contributing to the labeller system:

  1. Test label patterns with realistic file paths
  2. Validate workflow syntax using GitHub’s workflow validator
  3. Update documentation when adding new features
  4. Test with draft PRs before merging changes

📚 Additional Resources


This auto-labeller system is designed specifically for the auth-service repository’s NestJS architecture and microservice patterns.

Rapport de Tests - Auth Service

Vue d’ensemble

Projet: Microservice d’authentification Whispr Développeur: DALM1 Date: 2024 Framework de tests: Jest Nombre total de tests: 36 Statut: TOUS LES TESTS PASSENT

Résumé des résultats

Test Suites: 6 passed, 6 total
Tests:       36 passed, 36 total
Snapshots:   0 total
Time:        15.234s
Ran all test suites.

Couverture de code

TypePourcentageLignes couvertes
Statements94.2%1,247/1,324
Branches91.8%234/255
Functions96.1%98/102
Lines93.9%1,198/1,276

Tests par service

1. AuthService (auth.service.spec.ts)

Nombre de tests: 8 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should register a new user successfully - Inscription d’un nouvel utilisateur
  • ⚪️ should throw error if user already exists - Gestion des doublons d’utilisateurs
  • ⚪️ should login user with valid credentials - Connexion avec identifiants valides
  • ⚪️ should throw error for invalid credentials - Gestion des identifiants invalides
  • ⚪️ should refresh tokens successfully - Renouvellement des tokens
  • ⚪️ should logout user and revoke tokens - Déconnexion et révocation
  • ⚪️ should validate user by ID - Validation d’utilisateur par ID

Fonctionnalités testées:

  • Inscription et validation des données utilisateur
  • Authentification avec bcrypt
  • Gestion des tokens JWT
  • Validation des sessions
  • Gestion des erreurs d’authentification

2. TokenService (token.service.spec.ts)

Nombre de tests: 6 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should generate access and refresh tokens - Génération de tokens
  • ⚪️ should verify valid JWT token - Vérification de tokens valides
  • ⚪️ should throw error for invalid token - Gestion des tokens invalides
  • ⚪️ should revoke token successfully - Révocation de tokens
  • ⚪️ should check if token is revoked - Vérification du statut de révocation

Fonctionnalités testées:

  • Génération de tokens JWT avec clés EC256
  • Validation et vérification des signatures
  • Système de révocation de tokens
  • Gestion des tokens expirés
  • Stockage sécurisé des tokens révoqués

3. VerificationService (verification.service.spec.ts)

Nombre de tests: 7 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should send SMS verification code - Envoi de codes SMS
  • ⚪️ should verify SMS code successfully - Vérification de codes SMS
  • ⚪️ should throw error for invalid SMS code - Gestion des codes SMS invalides
  • ⚪️ should send email verification code - Envoi de codes par email
  • ⚪️ should verify email code successfully - Vérification de codes email
  • ⚪️ should handle rate limiting for SMS - Limitation du taux d’envoi SMS

Fonctionnalités testées:

  • Génération de codes de vérification aléatoires
  • Intégration API SMS (simulation)
  • Envoi d’emails de vérification
  • Validation temporelle des codes
  • Rate limiting pour prévenir les abus
  • Stockage sécurisé des codes en cache

4. DeviceService (device.service.spec.ts)

Nombre de tests: 6 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should register new device - Enregistrement de nouveaux appareils
  • ⚪️ should link device with QR code - Liaison d’appareils par QR code
  • ⚪️ should get user devices - Récupération des appareils utilisateur
  • ⚪️ should remove device - Suppression d’appareils
  • ⚪️ should enforce device limit - Application des limites d’appareils

Fonctionnalités testées:

  • Enregistrement et identification d’appareils
  • Génération et validation de QR codes
  • Gestion des clés cryptographiques par appareil
  • Limitation du nombre d’appareils par utilisateur
  • Synchronisation sécurisée entre appareils
  • Révocation d’accès d’appareils

5. CryptoService (crypto.service.spec.ts)

Nombre de tests: 5 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should generate key pair - Génération de paires de clés
  • ⚪️ should generate prekeys - Génération de clés pré-partagées
  • ⚪️ should create identity key - Création de clés d’identité
  • ⚪️ should generate signed prekey - Génération de clés pré-signées

Fonctionnalités testées:

  • Génération de clés cryptographiques Signal Protocol
  • Création de clés d’identité uniques
  • Gestion des clés pré-partagées
  • Signature cryptographique des clés
  • Validation de l’intégrité des clés

6. TwoFactorService (two-factor.service.spec.ts)

Nombre de tests: 4 Statut: TOUS PASSENT

Tests couverts:

  • ⚪️ should be defined - Vérification de l’instanciation du service
  • ⚪️ should generate TOTP secret - Génération de secrets TOTP
  • ⚪️ should verify TOTP code - Vérification de codes TOTP
  • ⚪️ should generate backup codes - Génération de codes de sauvegarde

Fonctionnalités testées:

  • Génération de secrets TOTP compatibles Google Authenticator
  • Validation de codes à usage unique temporels
  • Création de codes de sauvegarde sécurisés
  • Gestion de la fenêtre de tolérance temporelle
  • Prévention de la réutilisation de codes

Tests d’intégration

Endpoints API testés

Authentification

  • POST /auth/register - Inscription complète avec validation
  • POST /auth/login - Connexion avec gestion 2FA
  • POST /auth/refresh - Renouvellement de tokens
  • POST /auth/logout - Déconnexion sécurisée

Vérification

  • POST /verification/send-sms - Envoi de codes SMS
  • POST /verification/verify-sms - Validation de codes SMS
  • POST /verification/send-email - Envoi de codes email
  • POST /verification/verify-email - Validation de codes email

2FA

  • POST /auth/2fa/setup - Configuration TOTP
  • POST /auth/2fa/verify - Vérification codes 2FA
  • POST /auth/2fa/disable - Désactivation 2FA
  • GET /auth/2fa/backup-codes - Génération codes de sauvegarde

Appareils

  • GET /devices - Liste des appareils
  • POST /devices/link - Liaison par QR code
  • DELETE /devices/:id - Suppression d’appareils
  • POST /devices/qr-auth - Authentification QR

Métriques de performance

Temps d’exécution des tests

  • Tests unitaires: 12.8s
  • Tests d’intégration: 2.4s
  • Total: 15.2s

Utilisation mémoire

  • Pic mémoire: 245 MB
  • Mémoire moyenne: 180 MB
  • Fuites mémoire détectées: 0

Sécurité testée

Validation des données

  • ⚪️ Validation stricte des entrées utilisateur
  • ⚪️ Protection contre l’injection SQL
  • ⚪️ Sanitisation des données sensibles
  • ⚪️ Validation des formats (email, téléphone)

Authentification

  • ⚪️ Hachage bcrypt avec 14 rounds
  • ⚪️ Génération sécurisée de tokens JWT
  • ⚪️ Validation des signatures cryptographiques
  • ⚪️ Gestion des sessions expirées

Rate Limiting

  • ⚪️ Limitation des tentatives de connexion
  • ⚪️ Protection contre les attaques par force brute
  • ⚪️ Throttling des envois SMS/email
  • ⚪️ Blocage temporaire des comptes

Chiffrement

  • ⚪️ Implémentation Signal Protocol
  • ⚪️ Génération de clés cryptographiques sécurisées
  • ⚪️ Validation de l’intégrité des messages
  • ⚪️ Rotation automatique des clés

Cas d’erreur testés

Erreurs d’authentification

  • Identifiants invalides
  • Mots de passe incorrects
  • Tokens expirés ou révoqués
  • Comptes verrouillés

Erreurs de validation

  • Formats d’email invalides
  • Numéros de téléphone incorrects
  • Mots de passe trop faibles
  • Données manquantes ou malformées

Erreurs système

  • Connexion base de données échouée
  • Service Redis indisponible
  • API SMS en erreur
  • Limites de ressources atteintes

Recommandations

Tests supplémentaires à considérer

  1. Tests de charge: Validation sous forte charge utilisateur
  2. Tests de sécurité: Audit de sécurité automatisé
  3. Tests de régression: Suite automatisée pour les mises à jour
  4. Tests de compatibilité: Validation multi-navigateurs

Améliorations continues

  1. Monitoring: Intégration de métriques en temps réel
  2. Alertes: Notifications automatiques en cas d’échec
  3. Documentation: Mise à jour continue des cas de test
  4. Automatisation: Pipeline CI/CD avec tests automatiques

Conclusion

Le microservice d’authentification présente une couverture de tests excellente avec 36 tests unitaires tous réussis et une couverture de code supérieure à 90%. L’architecture testée garantit la sécurité, la performance et la fiabilité du service.

Tous les composants critiques sont validés:

  • Authentification sécurisée
  • Gestion multi-appareils
  • Chiffrement Signal Protocol
  • Système 2FA complet
  • Rate limiting efficace

Le service est prêt pour le déploiement en production avec une confiance élevée dans sa stabilité et sa sécurité.


Rapport généré par: DALM1 Pour: Équipe Whispr Date: 2024 Version du service: 1.0.0