Sécurité
Vue d'ensemble
Ce document recense les mesures de sécurité réellement implémentées dans tranoo-api, y compris les points d'attention connus.
Authentification
| Mesure | Implémentation | Fichier |
|---|---|---|
| Token Firebase | verifyIdToken sur routes protégées | middlewares/auth.js |
| Session web dashboard | X-Web-Session-Id + idle timeout 30 min | middlewares/auth.js |
| Blocage utilisateur | Vérification User.isBlocked | middlewares/auth.js |
| Rôles admin | Middleware role.js | middlewares/role.js |
Headers requis (dashboard web)
Authorization: Bearer <Firebase ID token>
X-Client-Platform: web
X-Web-Session-Id: <uuid>
Protection anti-abus
| Mesure | Configuration | Fichier |
|---|---|---|
| Rate limiting auth | 40 req / 15 min par IP (configurable) | middlewares/authRateLimit.js |
| CAPTCHA Turnstile | Sur POST /api/auth/register (web uniquement) | middlewares/verifyCaptcha.js |
| OTP reset | TTL court, tentatives limitées | config/authConfig.js |
Variables : AUTH_RATE_LIMIT_MAX, AUTH_RATE_LIMIT_ENABLED, CAPTCHA_ENABLED, TURNSTILE_SECRET_KEY
Firebase App Check
- Middleware
verifyAppCheck.jsimplémenté - Non monté sur les routes actuellement
- Activation :
FIREBASE_APP_CHECK_ENFORCED=true+ montage manuel dansapp.js
Secrets et credentials
| Élément | Stockage | Notes |
|---|---|---|
.env, .env.prod | Gitignored | Jamais committer |
| Firebase service account | FIREBASE_SERVICE_ACCOUNT_JSON (prod) | Pas de fichier en prod |
| FeexPay token | Variable d'environnement | |
| WhatsApp token | Variable d'environnement | |
| Cloudinary | Variables d'environnement |
Fichier dev (gitignored) : src/firebaseServiceAccountKey.json
CORS
Configuration actuelle dans src/app.js :
app.use(cors({ origin: '*' }));
Point d'attention : toutes les origines sont autorisées. En production, restreindre aux domaines tranoo.store et apps mobiles si possible.
Endpoints publics sensibles
| Endpoint | Risque | Recommandation |
|---|---|---|
POST /api/notifications/test | Pas d'auth | Retirer en production |
POST /api/upload/video | Pas d'auth middleware | Ajouter authMiddleware |
POST /api/payments/webhook | Public (normal pour webhook) | Valider signature FeexPay |
GET|POST /api/whatsapp/webhook | Public (normal pour Meta) | Vérification token Meta |
Validation des entrées
- Schémas Mongoose avec validation intégrée
- Codes d'erreur stables (
errorCodes.js) + messages localisés (apiResponse.js) - Validation téléphone :
phoneNormalize.js,authAppPhone.js
Séparation des comptes
- Email synthétique distinct par app (
@tranoo.appvspro_*@tranoo.app) - Un même numéro = deux comptes Firebase séparés (Tranoo vs Pro)
- Refus de rôle croisé à l'inscription
Webhooks
| Webhook | Vérification |
|---|---|
| FeexPay | Callback serveur (à valider côté FeexPay) |
| WhatsApp Meta | WHATSAPP_WEBHOOK_VERIFY_TOKEN sur GET |
Logs sensibles
Variables de debug (désactiver en prod) :
LOG_OTP=true— affiche OTP en consoleLOG_WHATSAPP=true— logs WhatsApp détaillésNODE_ENV=development
Checklist production
-
NODE_ENV=production -
LOG_OTPetLOG_WHATSAPPdésactivés -
POST /api/notifications/testdésactivé - Secrets via variables d'environnement (pas de fichiers)
- Turnstile configuré sur dashboard (
CAPTCHA.md) - CORS restreint si possible
- Firebase App Check activé si souhaité
Voir aussi
- Authentification
- Déploiement
tranoo-api/docs/CAPTCHA.md