Authentication Service (auth-service) - System Design Document
0. Sommaire
- 1. Introduction
- 2. Architecture Globale
- 3. Choix Technologiques
- 4. Composants Principaux
- 5. Scaling et Performances
- 6. Monitoring et Observabilité
- 7. Gestion des Erreurs et Résilience
- 8. Évolution et Maintenance
- 9. Considérations Opérationnelles
- Appendices
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étrique | Cible | Monitoring |
|---|---|---|
| Temps de réponse moyen | < 200ms | Prometheus + Grafana |
| 99e percentile temps de réponse | < 1s | Istio + Jaeger |
| Taux d’erreur | < 0.1% | Kiali + Prometheus |
| Disponibilité | > 99% | Istio Health Checks |
| Temps moyen de vérification SMS | < 10s | Custom metrics |
| mTLS Success Rate | > 99.9% | Istio metrics |
| Inter-service latency | < 50ms | Envoy metrics |
| Certificate rotation | Automatique | Istio CA |
| JWT Validation latency | < 50ms | Custom metrics |
| Device Registry lookup | < 20ms | Redis metrics |
B. Estimation des Ressources
| Ressource | Estimation Initiale | Istio Overhead |
|---|---|---|
| Instances de service | 3 replicas | + Envoy sidecars |
| CPU par instance | 1 vCPU | + 0.1 vCPU (Envoy) |
| Mémoire par instance | 2 GB RAM | + 200MB (Envoy) |
| Stockage PostgreSQL | 20 GB initial | - |
| Stockage Redis | 2 GB | - |
| Bandwidth mensuel | 50 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
- Spécification OpenAPI complète
- Schéma de sécurité Whispr
- Exigences non fonctionnelles
- Documentation officielle NestJS
- Bonnes pratiques NestJS
- JWT RFC 7519
- Istio Documentation
- Istio Security Best Practices
- Envoy Proxy Documentation
Conception de la Base de Données - Service d’Authentification
Sommaire
- 1. Introduction et Principes de Conception
- 2. Schéma PostgreSQL du Service d’Authentification
- 3. Données Temporaires dans Redis
- 4. Relations avec les Autres Services
- 5. Considérations de Sécurité
- 6. Considérations de Performance
- 7. Migrations et Évolution du Schéma
- 8. Scripts SQL d’Initialisation
- 9. Communication Inter-Services
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.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de l’utilisateur | PK, NOT NULL |
| phoneNumber | VARCHAR(20) | Numéro de téléphone au format E.164 | UNIQUE, NOT NULL |
| twoFactorSecret | VARCHAR(255) | Secret TOTP pour l’authentification à deux facteurs | ENCRYPTED, NULL |
| twoFactorEnabled | BOOLEAN | Indique si l’authentification à deux facteurs est activée | NOT NULL, DEFAULT FALSE |
| lastAuthenticatedAt | TIMESTAMP | Date/heure de la dernière authentification réussie | NULL |
| createdAt | TIMESTAMP | Date/heure de création du compte | NOT NULL |
| updatedAt | TIMESTAMP | Date/heure de la dernière mise à jour | NOT NULL |
Indices:
- PRIMARY KEY sur
id - UNIQUE sur
phoneNumber - INDEX sur
phoneNumberpour les recherches fréquentes
2.2.2 DEVICES
Stocke les informations sur les appareils associés à un compte utilisateur.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de l’appareil | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur propriétaire | FK (USERS_AUTH.id), NOT NULL |
| deviceName | VARCHAR(100) | Nom de l’appareil | NOT NULL |
| deviceType | VARCHAR(20) | Type d’appareil (iOS, Android, Web) | NOT NULL |
| deviceFingerprint | VARCHAR(255) | Empreinte unique de l’appareil | UNIQUE, NOT NULL |
| model | VARCHAR(100) | Modèle de l’appareil | NULL |
| osVersion | VARCHAR(50) | Version du système d’exploitation | NULL |
| appVersion | VARCHAR(20) | Version de l’application | NULL |
| fcmToken | VARCHAR(255) | Token pour les notifications push Android | NULL |
| apnsToken | VARCHAR(255) | Token pour les notifications push iOS | NULL |
| publicKey | TEXT | Clé publique de l’appareil pour le chiffrement | NOT NULL |
| lastActive | TIMESTAMP | Dernière activité de l’appareil | NOT NULL |
| ipAddress | VARCHAR(45) | Dernière adresse IP connue | NULL |
| isVerified | BOOLEAN | Indique si l’appareil a été vérifié | NOT NULL, DEFAULT FALSE |
| isActive | BOOLEAN | Indique si l’appareil est actif | NOT NULL, DEFAULT TRUE |
| createdAt | TIMESTAMP | Date/heure d’ajout de l’appareil | NOT NULL |
| updatedAt | TIMESTAMP | Date/heure de la dernière mise à jour | NOT NULL |
Indices:
- PRIMARY KEY sur
id - FOREIGN KEY sur
userId→users_auth(id) - UNIQUE sur
deviceFingerprint - INDEX sur
userIdpour les jointures fréquentes - INDEX sur
lastActivepour faciliter le nettoyage des appareils inactifs - INDEX sur
isActivepour filtrer les appareils actifs
2.2.3 PREKEYS
Stocke les clés préalables (pre-keys) pour le protocole Signal.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de la clé | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur propriétaire | FK (USERS_AUTH.id), NOT NULL |
| keyId | INTEGER | Identifiant de la clé dans le protocole | NOT NULL |
| publicKey | TEXT | Clé publique encodée | NOT NULL |
| isOneTime | BOOLEAN | Indique s’il s’agit d’une clé à usage unique | NOT NULL, DEFAULT TRUE |
| isUsed | BOOLEAN | Indique si la clé a déjà été utilisée | NOT NULL, DEFAULT FALSE |
| createdAt | TIMESTAMP | Date/heure de création | NOT NULL |
Indices:
- PRIMARY KEY sur
id - UNIQUE sur
(userId, keyId)pour éviter les doublons - INDEX sur
userIdpour les recherches
2.2.4 SIGNED_PREKEYS
Stocke les clés préalables signées pour le protocole Signal.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de la clé | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur propriétaire | FK (USERS_AUTH.id), NOT NULL |
| keyId | INTEGER | Identifiant de la clé dans le protocole | NOT NULL |
| publicKey | TEXT | Clé publique encodée | NOT NULL |
| signature | TEXT | Signature cryptographique | NOT NULL |
| createdAt | TIMESTAMP | Date/heure de création | NOT NULL |
| expiresAt | TIMESTAMP | Date/heure d’expiration | NOT NULL |
Indices:
- PRIMARY KEY sur
id - UNIQUE sur
(userId, keyId)pour éviter les doublons - INDEX sur
userIdpour les recherches
2.2.5 IDENTITY_KEYS
Stocke les clés d’identité pour le protocole Signal.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de la clé | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur propriétaire | FK (USERS_AUTH.id), NOT NULL |
| publicKey | TEXT | Clé publique encodée | NOT NULL |
| privateKeyEncrypted | TEXT | Clé privée chiffrée (si nécessaire) | ENCRYPTED, NULL |
| createdAt | TIMESTAMP | Date/heure de création | NOT NULL |
| updatedAt | TIMESTAMP | Date/heure de la dernière mise à jour | NOT 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.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique du code | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur propriétaire | FK (USERS_AUTH.id), NOT NULL |
| codeHash | VARCHAR(255) | Hachage du code de secours | NOT NULL |
| used | BOOLEAN | Indique si le code a été utilisé | NOT NULL, DEFAULT FALSE |
| createdAt | TIMESTAMP | Date/heure de création | NOT NULL |
| usedAt | TIMESTAMP | Date/heure d’utilisation | NULL |
Indices:
- PRIMARY KEY sur
id - INDEX sur
userIdpour les recherches
2.2.7 LOGIN_HISTORY
Enregistre l’historique des connexions.
| Colonne | Type | Description | Contraintes |
|---|---|---|---|
| id | UUID | Identifiant unique de l’entrée | PK, NOT NULL |
| userId | UUID | Référence à l’utilisateur | FK (USERS_AUTH.id), NOT NULL |
| deviceId | UUID | Référence à l’appareil utilisé | FK (DEVICES.id), NULL |
| ipAddress | VARCHAR(45) | Adresse IP de la connexion | NOT NULL |
| userAgent | TEXT | User-agent du client | NULL |
| createdAt | TIMESTAMP | Date/heure de la tentative | NOT NULL |
| status | VARCHAR(20) | Statut (success, failed, etc.) | NOT NULL |
Indices:
- PRIMARY KEY sur
id - INDEX sur
userIdpour les recherches - INDEX sur
deviceIdpour les recherches par appareil - INDEX sur
createdAtpour 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 ciblehashedCode: Code de vérification hachépurpose: Objectif (registration, login, recovery, phone_change)attempts: Nombre de tentatives effectuéesexpiresAt: 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’utilisateurdeviceId: ID de l’appareiltokenFamily: Famille de tokens pour le refreshlastActive: 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 cryptographiqueexpiresAt: 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
devicescomplè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_tokenslé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 à jourUserAuthenticated: 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
- 2. Gestion des Identités et des Accès
- 3. Chiffrement et Protection des Données
- 4. Protection Contre les Menaces
- 5. Gestion des Secrets
- 6. Détection et Réponse aux Incidents
- 7. Sécurité du Développement
- 8. Standards de Sécurité
- 9. Sauvegarde et Récupération
- 10. Communication Inter-Services
- 11. Documentation
- Annexes
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
| Risque | Probabilité | Impact | Mesures de Contrôle |
|---|---|---|---|
| Compromission des clés Signal | Faible | Critique | Rotation des clés, stockage sécurisé |
| Attaque par force brute | Moyenne | Élevé | Rate limiting, détection des anomalies |
| Vol de token d’authentification | Moyenne | Élevé | Courte durée de vie, révocation |
| Injection SQL | Faible | Critique | ORM, requêtes paramétrées |
| Fuite de données sensibles | Faible | Critique | Chiffrement, masquage des logs |
| Compromission communication inter-services | Faible | Critique | mTLS automatique Istio, AuthorizationPolicies |
| Déni de service sur service mesh | Moyenne | Élevé | Circuit breakers, rate limiting Istio |
| Misconfiguration Istio | Moyenne | Élevé | Validation des policies, tests automatisés |
| Certificat mTLS compromis | Faible | Élevé | Rotation automatique, monitoring Istio |
| Désynchronisation inter-services | Faible | Moyen | Service 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
- 2. Processus d’inscription
- 3. Processus d’authentification
- 4. Authentification multi-appareils (QR Code)
- 5. Gestion des appareils intégrée
- 6. Endpoints API
- 7. Tests
- 8. Considérations opérationnelles
- Livrables
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:
- Inscription: Vérification du numéro de téléphone et création de compte avec enregistrement d’appareil
- Connexion: Authentification standard avec vérification par SMS et gestion d’appareil
- 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
- Demande de vérification: L’utilisateur soumet son numéro de téléphone via l’application.
- 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
- 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
- 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
- Saisie du code: L’utilisateur entre le code reçu par SMS dans l’application.
- 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é
- 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
- Soumission des informations: L’utilisateur complète son profil (nom, prénom, éventuellement photo) et fournit les informations d’appareil.
- 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
- 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
- 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
- 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
- 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
- Demande de vérification: L’utilisateur soumet son numéro de téléphone pour se connecter.
- 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
- 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
- Vérification du code:
- L’utilisateur saisit le code reçu
- Le système vérifie la validité comme pour l’inscription
- 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
-
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
-
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
-
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
-
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
-
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
- 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
- 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
- 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
- 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
- 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
- Validation du challenge:
- Vérifie l’authenticité et la validité temporelle du challenge
- S’assure qu’il n’a pas déjà été utilisé
- 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
- 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
- Confirmation à l’appareil authentifié:
- Un message de succès est envoyé à l’appareil qui a scanné le QR
- 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
- 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 :
-
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
-
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
| Endpoint | Méthode | Description | Services impliqués |
|---|---|---|---|
/auth/register/verify/request | POST | Demande de code de vérification pour inscription | auth-service → user-service |
/auth/register/verify/confirm | POST | Confirmation du code de vérification | auth-service |
/auth/register | POST | Finalisation de l’inscription avec enregistrement d’appareil | auth-service → user-service, notification-service |
/auth/login/verify/request | POST | Demande de code de vérification pour connexion | auth-service → user-service |
/auth/login/verify/confirm | POST | Confirmation du code de vérification | auth-service |
/auth/login | POST | Finalisation de la connexion avec gestion d’appareil | auth-service → user-service, notification-service |
/auth/scan-login | POST | Authentification par QR code avec enregistrement d’appareil | auth-service → notification-service |
/auth/logout | POST | Déconnexion avec gestion de session d’appareil | auth-service → notification-service |
/auth/refresh | POST | Renouvellement de token | auth-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
- 2. Flux d’activation de la 2FA
- 3. Flux d’authentification avec 2FA activée
- 4. Flux d’utilisation des codes de secours
- 5. Désactivation de la 2FA
- 6. Spécifications techniques
- 7. Considérations d’implémentation
- 8. Communication inter-services
- 9. Tests
- 10. Considérations opérationnelles
- 11. Livrables
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:
- Activation de la 2FA: Configuration initiale et liaison de l’application d’authentification
- Authentification avec 2FA: Vérification du code temporaire lors de la connexion
- Gestion des codes de secours: Génération, visualisation et utilisation des codes de récupération
- 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
- Initiation: L’utilisateur demande l’activation de la 2FA depuis les paramètres de sécurité.
- Vérification préalable: Le service authentifie l’utilisateur et vérifie qu’il n’a pas déjà activé la 2FA.
- Génération du secret: Un secret TOTP aléatoire de 20 octets est généré et encodé en Base32.
- 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)
- Génération du QR Code: L’URL TOTP est encodée dans un QR code.
Phase de validation
- Association de l’application: L’utilisateur scanne le QR code avec son application d’authentification.
- Vérification: L’utilisateur saisit le code à 6 chiffres généré par l’application.
- Validation du code: Le service vérifie que le code est correct, avec une fenêtre de tolérance de ±1 période (30s).
- Génération des codes de secours: Si le code est valide, 10 codes de secours alphanumériques sont générés.
- 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é
- 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
- Identique au processus standard: L’utilisateur suit le flux normal de vérification par SMS.
- 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
- Gestion directe de l’appareil: auth-service identifie ou enregistre l’appareil utilisé dans sa propre table devices.
- Vérification du statut 2FA: auth-service vérifie si l’appareil nécessite une vérification 2FA.
- Demande de code 2FA: L’application demande à l’utilisateur de fournir le code de son application d’authentification.
- 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)
- 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)
- 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
- 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.
- Saisie du code: L’utilisateur entre l’un des 10 codes de secours qui lui ont été fournis lors de l’activation.
- 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é
- Utilisation à usage unique: Chaque code ne peut être utilisé qu’une seule fois.
- 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
- 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
- Demande de désactivation: L’utilisateur accède à l’option de désactivation dans les paramètres de sécurité.
- Confirmation de sécurité: Pour confirmer son identité, l’utilisateur doit fournir un code TOTP valide de son application d’authentification.
- Validation du code: Le système vérifie que le code est correct avant de procéder.
- 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
- 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
- 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:
otplibpour la génération et validation TOTP - Frontend:
qrcodepour la génération des QR codes - Hachage:
bcryptpour les codes de secours - gRPC:
@nestjs/microservicespour 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
| Endpoint | Méthode | Description | Services impliqués |
|---|---|---|---|
/auth/me/2fa-status | GET | Obtenir le statut 2FA | auth-service → user-service |
/auth/2fa/enable | POST | Initier l’activation 2FA | auth-service |
/auth/2fa/verify | POST | Vérifier code TOTP | auth-service → user-service, notification-service |
/auth/2fa/disable | POST | Désactiver 2FA | auth-service → user-service, notification-service |
/auth/2fa/recovery | POST | Utiliser code de secours | auth-service → user-service, notification-service |
/auth/2fa/backup-codes | GET | Obtenir nouveaux codes de secours | auth-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
- 2. Enregistrement d’un nouvel appareil
- 3. Gestion des appareils connectés
- 4. Déconnexion à distance
- 5. Synchronisation entre appareils
- 6. Vérification de sécurité entre appareils
- 7. Aspects techniques
- 8. Communication inter-services
- 9. Tests
- 10. Considérations opérationnelles
- 11. Livrables
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:
- Enregistrement d’appareil: Ajout d’un nouvel appareil au compte utilisateur via auth-service
- Gestion des appareils: Visualisation et contrôle des appareils connectés
- Déconnexion à distance: Révocation d’accès gérée par auth-service
- Synchronisation: Transfert et mise à jour des données coordonnées entre services
- 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 :
- Enregistrement lors de l’authentification directe : Via le processus standard de vérification par SMS
- Authentification par QR code : Méthode privilégiée utilisant un appareil déjà connecté
- 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 :
- Recevoir son deviceId : Identifiant unique attribué par auth-service
- Configurer les clés cryptographiques : Génération et stockage des clés Signal
- Synchroniser les données initiales : Coordination avec user-service pour profil et contacts
- Configurer les notifications : Communication du token FCM/APNS à notification-service
- 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 :
-
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
-
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
-
Effacement local :
- L’application efface les tokens et données sensibles sur l’appareil
- Nettoyage du cache local des clés cryptographiques
-
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 :
- Synchronisation initiale : Lors de la première connexion d’un appareil
- Synchronisation push : Notifications en temps réel via notification-service
- Synchronisation pull : Demandes périodiques pour récupérer les mises à jour
- Synchronisation à la demande : L’utilisateur peut forcer une synchronisation
- 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 :
- Format numérique : Séquence de chiffres facilement comparable (ex: “12-34-56-78-90-12”)
- Format QR : Code QR encodant les informations de vérification
- Empreinte visuelle : Représentation graphique unique (similaire à Signal)
- 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
| Endpoint | Méthode | Description | Service responsable |
|---|---|---|---|
/auth/devices | GET | Liste tous les appareils de l’utilisateur | auth-service |
/auth/devices | POST | Enregistre un nouvel appareil | auth-service |
/auth/devices/{deviceId} | GET | Obtient les détails d’un appareil | auth-service |
/auth/devices/{deviceId} | PUT | Met à jour les informations d’un appareil | auth-service |
/auth/devices/{deviceId} | DELETE | Déconnecte un appareil | auth-service |
/auth/devices/disconnect-all-except-current | POST | Déconnecte tous les autres appareils | auth-service |
/auth/devices/{deviceId}/security-code | GET | Obtient le code de sécurité pour vérification | auth-service |
/auth/devices/{deviceId}/verify | POST | Marque un appareil comme vérifié | auth-service |
/auth/sync/initial-data | GET | Récupère les données initiales pour un nouvel appareil | auth-service |
/auth/sync/updates | GET | Récupère les mises à jour depuis un horodatage | auth-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:
- Double Ratchet Algorithm: Algorithme central de dérivation et rotation des clés
- Curve25519: Cryptographie à courbe elliptique pour l’échange de clés Diffie-Hellman
- Triple Diffie-Hellman (X3DH): Protocole d’établissement de session initiale
- HKDF: Fonction de dérivation de clés basée sur HMAC
- AES-256: Chiffrement symétrique des messages
- HMAC-SHA256: Authentification des messages
- 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:
-
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
-
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)
-
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
-
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
-
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
-
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
-
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
-
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:
- Ratchet Diffie-Hellman: Échange régulier de nouvelles clés publiques pour renouveler le secret partagé
- 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
-
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
-
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
-
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
-
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
-
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
-
Utilisation:
- Utilisée pour l’authentification des messages
- Employée dans l’établissement initial de session (X3DH)
- Sert à signer les clés préalables
-
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é
-
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
-
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)
-
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
-
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
-
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
-
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
-
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
-
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
-
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) |
+-------------------------------------------------------------------------+
-
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)
-
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
-
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:
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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:
-
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
-
Curve25519-XSalsa20-Poly1305:
- Boîte cryptographique combinant courbe elliptique et chiffrement symétrique
- Utilisée pour les opérations cryptographiques de base
-
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
-
protobuf.js:
- Sérialisation et désérialisation efficace des messages
- Format binaire compact pour la transmission
-
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]
-
Couche d’application:
- Interface avec la logique métier de Whispr
- Gestion des messages utilisateur et de l’interface
-
Gestionnaire de sessions Signal:
- Cœur de l’implémentation du protocole
- Maintient l’état de toutes les sessions cryptographiques
-
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
-
Couche de chiffrement:
- Implémentation des algorithmes cryptographiques
- Double Ratchet, X3DH et primitives associées
-
Gestionnaire de messages:
- Traitement des messages entrants et sortants
- File d’attente pour les messages en échec
- Synchronisation multi-appareils
-
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
-
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
-
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
-
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
-
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
| Terme | Description |
|---|---|
| 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é |
| X3DH | Extended Triple Diffie-Hellman - Protocole d’établissement de session asynchrone |
| HKDF | HMAC-based Key Derivation Function - Fonction de dérivation de clés basée sur HMAC |
| Forward Secrecy | Propriété garantissant que la compromission future d’une clé ne permet pas de déchiffrer les messages passés |
| PreKey | Clé préalable permettant l’établissement asynchrone de session, gérée par auth-service |
| Double Ratchet | Algorithme combinant ratchet symétrique et asymétrique pour la dérivation continue de clés |
| AES-256 | Advanced Encryption Standard - Algorithme de chiffrement symétrique avec clé de 256 bits |
| Curve25519 | Courbe elliptique utilisée pour les opérations de cryptographie asymétrique |
| DeviceId | Identifiant unique d’appareil géré par auth-service |
B. Matrice de menaces et contrôles
| Menace | Impact | Contrôle |
|---|---|---|
| Interception de messages | Divulgation de contenu | Chiffrement E2E avec AES-256 |
| Compromission de clés à long terme | Usurpation d’identité | Forward secrecy via Double Ratchet |
| Attaque par rejeu | Confusion, répétition de messages | Compteurs et identifiants uniques par message |
| Attaque par homme du milieu | Interception active | Vérification des clés d’identité via auth-service |
| Compromission d’appareil | Accès aux messages | Chiffrement local et verrouillage par code |
| Modification de messages | Intégrité compromise | HMAC-SHA256 sur chaque message |
| Compromission auth-service | Fuite clés publiques | Clé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
- 2. Structure d’un Epic Jira basé sur une spécification
- 3. Décomposition en User Stories
- 4. Création des Tasks Techniques
- 5. Gestion des Dépendances Inter-Services
- 6. Définition de “Done” (DoD) par Epic
- 7. Bonnes Pratiques pour le Suivi
- 8. Template d’Epic Jira
- 9. Outils Recommandés
- 10. Exemples Complets
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
- Analyser les diagrammes de séquence : Chaque interaction principale devient une user story
- Identifier les acteurs : Utilisateur, Admin, Système, Services externes
- Extraire les actions : Chaque action significative dans le processus
- 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
- Section “Livrables” → Tasks de développement des modules
- Diagrammes de séquence → Appels API et intégrations inter-services
- Section “Tests” → Tasks de validation et qualité
- 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 comptesnotification-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-servicedépend deuser-servicepour vérifier les comptesauth-servicedépend denotification-servicepour 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 :
-
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
-
Changement technique → Update des user stories
- Impact assessment sur les autres services
- Mise à jour des dépendances
- Communication aux équipes concernées
-
Nouvelle contrainte → Ajout de critère d’acceptation
- Évaluation de l’impact planning
- Tests supplémentaires requis
- Validation par le product owner
-
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
| Endpoint | Méthode | Description | Paramètres |
|---|---|---|---|
/auth/register/verify/request | POST | Demande vérification pour inscription | { phoneNumber: string } |
/auth/register/verify/confirm | POST | Confirme code pour inscription | { verificationId: string, code: string } |
/auth/register | POST | Finalise l’inscription | { verificationId: string, firstName: string, lastName: string, ... } |
/auth/login/verify/request | POST | Demande vérification pour connexion | { phoneNumber: string } |
/auth/login/verify/confirm | POST | Confirme code pour connexion | { verificationId: string, code: string } |
/auth/login | POST | Finalise la connexion | { verificationId: string } |
/auth/scan-login | POST | Authentifie via QR code | { challenge: string, authenticatedDeviceId: string, ... } |
/auth/refresh | POST | Rafraîchit le token d’accès | { refreshToken: string } |
/auth/logout | POST | Déconnexion | - |
/auth/devices | GET | Liste appareils connectés | - |
/auth/devices/{deviceId} | DELETE | Ré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é | Phase | Dépend de | Requis pour |
|---|---|---|---|
| Authentification Base | P.O.C | Services SMS, Redis | Keynote P.O.C, toutes autres fonctionnalités |
| Gestion Sessions | P.O.C | Authentification | user-service, autres services |
| 2FA | P.O.C | Authentification, Sessions | Sécurité avancée MVP |
| Gestion Appareils | P.O.C | Authentification, 2FA | Chiffrement E2E |
| Protocole Signal | P.O.C/MVP | Gestion Appareils | messaging-service |
| Multi-Device Complet | MVP | Protocole Signal | Keynote 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
| Risque | Probabilité | Impact | Mitigation |
|---|---|---|---|
| Retard avant keynote P.O.C | Moyenne | Critique | Buffer 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 finale | Moyenne | Critique | Jalons intermédiaires, backup plans |
| Qualité vs timing | Élevée | Moyen | Priorisation stricte, scope flexible |
Risques Techniques
| Risque | Probabilité | Impact | Mitigation |
|---|---|---|---|
| Performance crypto | Moyenne | Élevé | Benchmarking continu, optimisations précoces |
| Intégration services | Moyenne | Élevé | Tests d’intégration continus, mocks robustes |
| Scalabilité Redis | Faible | Moyen | Configuration 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
| Date | Jalon | Critères de succès |
|---|---|---|
| Fin Août | Auth Core P.O.C | Authentification + Sessions + JWT |
| Fin Septembre | Sécurité Avancée P.O.C | 2FA + Multi-device + QR Auth |
| Fin Novembre | Crypto P.O.C Complet | Signal Protocol base + Multi-device concepts |
| 🎯 Mi-Décembre | Keynote ESP - P.O.C | Démonstration convaincante P.O.C |
| Fin Janvier | Production Auth | Auth + 2FA + Devices en production |
| Fin Mars | E2E Complet | Signal Protocol complet + Multi-device robuste |
| Fin Avril | MVP Finalisé | Tous services intégrés + Performance optimisée |
| 🎯 Mi-Mai | Keynote ESP - Final MVP | Pré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
- Client calls
POST /auth/registerwith user credentials - Service sends SMS verification code
- Client calls
POST /auth/confirm-registrationwith verification code - Service returns user data, tokens, and device information
Standard Login Flow
- Client calls
POST /auth/loginwith credentials - If 2FA is enabled, service returns verification requirement
- Client calls
POST /auth/verify-2fawith 2FA code - Service returns user data, tokens, and device information
QR Code Authentication Flow
- Authenticated device calls
POST /auth/qr/generate - New device scans QR code and calls
POST /auth/qr/scan - Authenticated device approves via
POST /auth/qr/approve - 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 failedVERIFICATION_REQUIRED: SMS or 2FA verification neededVERIFICATION_EXPIRED: Verification code expiredVERIFICATION_INVALID: Invalid verification codeRATE_LIMIT_EXCEEDED: Too many requestsDEVICE_LIMIT_EXCEEDED: Maximum devices reachedTWO_FACTOR_REQUIRED: 2FA setup requiredACCOUNT_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
- JWT Token Expired: Refresh tokens using the refresh endpoint
- SMS Not Received: Check SMS provider configuration and rate limits
- 2FA Setup Failed: Verify TOTP secret generation and QR code display
- 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:
- La gestion des données utilisateur
- L’authentification multi-appareils
- L’autonomie et la résilience des services
- Les performances des opérations d’authentification fréquentes
- 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
- 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.
- Performance: Pas besoin d’appels gRPC synchrones pour chaque vérification d’authentification, ce qui améliore les performances et la résilience.
- Gestion du découplage: La table users_auth simplifiée dans auth-service permet de découpler les cycles de vie des deux services.
- Scalabilité indépendante: Chaque service peut être mis à l’échelle selon ses propres besoins de charge.
- 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
- Duplication partielle de données: Le numéro de téléphone et l’identifiant utilisateur sont dupliqués dans les deux services.
- 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).
- Complexité accrue: La gestion de deux sources de vérité partielles augmente la complexité du système.
- 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:
-
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
-
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
-
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
- Article sur les microservices et la gestion des données partagées
- Documentation Whispr: Modèle de données auth-service
- Documentation Whispr: Modèle de données user-service
- Documentation gRPC
Kubernetes Deployment Documentation
Resources
- Deployments - kubernetes.io
- Pods - kubernetes.io
- Kubernetes Pod Sizing - medium.com
- How to profile a NestJS application
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:
- 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. - 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.
- 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:
- Interceptors: Une manière propre de mesurer le temps de traitement des requêtes
- Middleware: Capturer le temps de début et de fin des requêtes
- Memory tracking: Utilisez
process.memoryUsage()pour monitorer la mémoire. - Log monitoring: Enregistrez les temps d’exécution et les erreurs critiques.
- 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
-
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
-
SONAR_HOST_URL :
https://sonarqube.whispr.epitech-msc2026.me✅ (configuré) -
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
- Allez dans votre serveur Discord
- Cliquez sur le nom du serveur → Paramètres du serveur
- Dans la barre latérale, cliquez sur Intégrations
- Cliquez sur Webhooks → Nouveau Webhook
- 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
- Nom :
- Cliquez sur Copier l’URL du Webhook
2. Ajouter le Secret GitHub
- Allez dans votre repository GitHub
- Cliquez sur Settings (Paramètres)
- Dans la barre latérale, cliquez sur Secrets and variables → Actions
- Cliquez sur New repository secret
- Créez un secret avec :
- Name :
DISCORD_WEBHOOK_URL - Secret : Collez l’URL du webhook Discord que vous avez copiée
- Name :
- 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
- ✅ Vérifiez que l’URL du webhook Discord est correcte dans les secrets
- ✅ Vérifiez que le secret
DISCORD_WEBHOOK_URLest bien configuré - ✅ Consultez les logs du workflow dans GitHub Actions
- ✅ Testez l’URL du webhook avec curl ou Postman
Les notifications ne s’affichent pas correctement
- ✅ Vérifiez que le webhook a les permissions d’écrire dans le canal
- ✅ Vérifiez que l’URL du webhook n’a pas expiré
- ✅ 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
- Discord Webhook Action (GitHub Marketplace)
- Repository de l’action
- Discord Webhooks Documentation
- GitHub Actions Workflow Syntax
- GitHub PR Events
🏷️ 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 labelslabels.yml- Complete label definitions with colors and descriptionssetup-labels.sh- Script to create/update all labels in the repositoryworkflows/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:
- Analyzes file changes and applies appropriate component labels
- Calculates PR size based on lines of code changed
- Detects priority level based on critical file modifications
- Identifies change types (security, database, testing, etc.)
- Suggests reviewers based on affected components
- 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
- Update
labeler.ymlto add file pattern mappings - Update
labels.ymlto define the new label - Update
setup-labels.shto include the new label creation - 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
- Check workflow permissions - Ensure the workflow has
pull-requests: writepermission - Verify file patterns - Test your patterns against actual file paths
- Check workflow logs - Look at the Actions tab for error messages
Setup Script Issues
-
GitHub CLI authentication:
gh auth status gh auth login # if not authenticated -
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:
- Test label patterns with realistic file paths
- Validate workflow syntax using GitHub’s workflow validator
- Update documentation when adding new features
- Test with draft PRs before merging changes
📚 Additional Resources
- GitHub Labeler Action Documentation
- GitHub Actions Workflow Syntax
- Conventional Commits Specification
- Auth Service Architecture Documentation
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
| Type | Pourcentage | Lignes couvertes |
|---|---|---|
| Statements | 94.2% | 1,247/1,324 |
| Branches | 91.8% | 234/255 |
| Functions | 96.1% | 98/102 |
| Lines | 93.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 validationPOST /auth/login- Connexion avec gestion 2FAPOST /auth/refresh- Renouvellement de tokensPOST /auth/logout- Déconnexion sécurisée
Vérification
POST /verification/send-sms- Envoi de codes SMSPOST /verification/verify-sms- Validation de codes SMSPOST /verification/send-email- Envoi de codes emailPOST /verification/verify-email- Validation de codes email
2FA
POST /auth/2fa/setup- Configuration TOTPPOST /auth/2fa/verify- Vérification codes 2FAPOST /auth/2fa/disable- Désactivation 2FAGET /auth/2fa/backup-codes- Génération codes de sauvegarde
Appareils
GET /devices- Liste des appareilsPOST /devices/link- Liaison par QR codeDELETE /devices/:id- Suppression d’appareilsPOST /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
- Tests de charge: Validation sous forte charge utilisateur
- Tests de sécurité: Audit de sécurité automatisé
- Tests de régression: Suite automatisée pour les mises à jour
- Tests de compatibilité: Validation multi-navigateurs
Améliorations continues
- Monitoring: Intégration de métriques en temps réel
- Alertes: Notifications automatiques en cas d’échec
- Documentation: Mise à jour continue des cas de test
- 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