CognxSafeTrack commited on
Commit ·
3f3bf16
1
Parent(s): 979cb50
docs: add technical documentation for WhatsApp B2B architecture (force add)
Browse files
docs/whatsapp_b2b_architecture.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Architecture WhatsApp B2B - Xamlé Studio
|
| 2 |
+
|
| 3 |
+
Ce document détaille l'architecture technique, la sécurité et les flux de données mis en place pour la plateforme EdTech multi-organisations.
|
| 4 |
+
|
| 5 |
+
## 1. Sécurité & Infrastructure
|
| 6 |
+
|
| 7 |
+
### 🔐 Gestion des Secrets
|
| 8 |
+
La plateforme utilise une approche "Zero-Trust" pour les variables d'environnement critiques. Le serveur refuse de démarrer si les secrets suivants ne sont pas configurés ou s'ils sont trop courts (minimum 32 caractères pour la production) :
|
| 9 |
+
|
| 10 |
+
- **`JWT_SECRET`** : Utilisé pour signer et vérifier les tokens d'authentification des administrateurs d'organisation.
|
| 11 |
+
- **`ENCRYPTION_SECRET`** : Clé maître utilisée pour chiffrer les secrets des tenants (Clés OpenAI, Stripe, Tokens Meta) avant leur stockage en base de données.
|
| 12 |
+
- **`ADMIN_API_KEY`** : Clé utilisée pour sécuriser les communications entre les micro-services (Gateway <-> API <-> Worker).
|
| 13 |
+
|
| 14 |
+
### 🌐 Restriction CORS
|
| 15 |
+
Pour prévenir les attaques XSS et les accès non autorisés, le middleware CORS est configuré de manière stricte dans `apps/api/src/index.ts`. Seuls les domaines suivants sont autorisés à appeler l'API en production :
|
| 16 |
+
- `https://admin.xamle.studio` (Dashboard principal)
|
| 17 |
+
- `https://xamle.studio` (Site vitrine)
|
| 18 |
+
- `https://edtechadmin.netlify.app` / `https://edtechadminweb.netlify.app` (Environnements de staging/admin)
|
| 19 |
+
|
| 20 |
+
## 2. Communication Interne & Webhooks
|
| 21 |
+
|
| 22 |
+
### 🔄 Forwarding des Webhooks
|
| 23 |
+
Comme la plateforme peut être déployée derrière une Gateway (ex: HuggingFace ou Railway Public), un mécanisme de forwarding intelligent est en place :
|
| 24 |
+
|
| 25 |
+
1. **Réception** : L'API reçoit le webhook de Meta sur `/v1/whatsapp/webhook`.
|
| 26 |
+
2. **Validation HMAC** : L'API vérifie la signature `x-hub-signature-256` envoyée par Meta avec le `WHATSAPP_APP_SECRET`.
|
| 27 |
+
3. **Forwarding** : Si l'API agit comme Gateway, elle renvoie la requête au Worker interne via `RAILWAY_INTERNAL_URL`.
|
| 28 |
+
4. **Authentification Interne** : Ce transfert est sécurisé par le header **`x-api-key`** contenant la `ADMIN_API_KEY`. Le service de destination valide ce header avant de traiter la requête.
|
| 29 |
+
|
| 30 |
+
## 3. Flux "Embedded Signup" (Intégration Meta)
|
| 31 |
+
|
| 32 |
+
L'intégration d'une nouvelle organisation à WhatsApp se fait via le flux **Embedded Signup** de Meta.
|
| 33 |
+
|
| 34 |
+
### 🌊 Parcours de Données
|
| 35 |
+
1. **Frontend** : L'administrateur clique sur "Connexion WhatsApp". Le SDK Meta s'ouvre, l'utilisateur sélectionne son compte Business et son numéro.
|
| 36 |
+
2. **Callback** : Le Frontend reçoit un `accessToken` temporaire et les IDs Meta (`wabaId`, `phoneNumberId`).
|
| 37 |
+
3. **Backend (API)** : Le Frontend appelle la route `POST /v1/organizations/:id/whatsapp-setup`.
|
| 38 |
+
4. **Chiffrement & Stockage** :
|
| 39 |
+
- L'API chiffre l' `accessToken` avec l' `ENCRYPTION_SECRET`.
|
| 40 |
+
- Elle stocke le token et le `wabaId` dans la table `Organization`.
|
| 41 |
+
- Elle effectue un `upsert` dans la table `WhatsAppPhoneNumber` pour lier le numéro technique à l'organisation.
|
| 42 |
+
5. **Invalidation Cache** : Le service `invalidateOrganizationCache` est appelé pour forcer le Worker à charger la nouvelle configuration au prochain message reçu.
|
| 43 |
+
|
| 44 |
+
## 4. Maintenance
|
| 45 |
+
Toute modification du schéma de données doit être accompagnée d'une migration Prisma (`npx prisma migrate dev`). Les logs sont centralisés via **Pino** et formatés en JSON pour être indexables par des outils comme Logtail ou Datadog.
|