chore(deps): add helmet, express-rate-limit, express-validator
Add production dependencies introduced in recent security commits. Add docs/ENVIRONMENT_VARIABLES.md documenting TRUST_PROXY, SECRET, SESSION_SECRET, and ALLOWED_ORIGINS with configuration guidance.
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
# Variables d'environnement — Adastra API
|
||||
|
||||
Référence pour les variables sensibles ou non-triviales. Pour les valeurs par défaut et la liste exhaustive, voir `config/env/.env.example`.
|
||||
|
||||
---
|
||||
|
||||
## TRUST_PROXY
|
||||
|
||||
**Fichier concerné :** `src/createApp.js`
|
||||
**Utilisé par :** `express-rate-limit` (IP réelle du client), `req.ip`
|
||||
|
||||
### Principe
|
||||
|
||||
Indique à Express combien de proxies se trouvent entre internet et le process Node. Sans cette valeur, `req.ip` retourne l'IP du proxy (`127.0.0.1`) au lieu de l'IP du client réel, ce qui rend le rate limiting inefficace (toutes les requêtes semblent venir de la même IP).
|
||||
|
||||
### Valeurs selon la topologie
|
||||
|
||||
| Environnement | Topologie | Valeur |
|
||||
|---|---|---|
|
||||
| Dev local | Node exposé directement, pas de proxy | ne pas setter (variable absente) |
|
||||
| Prod — serveur seul | nginx → Node sur le même serveur | `1` |
|
||||
| Prod — cloud avec LB | nginx → load balancer → Node | `2` |
|
||||
| Confiance totale | Tous les proxies de la chaîne `X-Forwarded-For` | `true` (déconseillé) |
|
||||
|
||||
> **Règle générale :** `TRUST_PROXY` = nombre de proxies entre internet et Node.
|
||||
|
||||
### Vérification empirique
|
||||
|
||||
Ajouter temporairement cette route et appeler `/debug-ip` depuis l'extérieur :
|
||||
|
||||
```js
|
||||
app.get('/debug-ip', (req, res) => {
|
||||
res.json({
|
||||
ip: req.ip,
|
||||
ips: req.ips,
|
||||
xForwardedFor: req.headers['x-forwarded-for']
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
- `req.ip` retourne l'IP réelle du client → valeur correcte
|
||||
- `req.ip` retourne `127.0.0.1` ou l'IP du proxy → augmenter de 1
|
||||
- `req.ips` est vide malgré un proxy → idem
|
||||
|
||||
**Supprimer la route après vérification.**
|
||||
|
||||
### Implémentation actuelle
|
||||
|
||||
```js
|
||||
if (process.env.TRUST_PROXY) {
|
||||
app.set('trust proxy', parseInt(process.env.TRUST_PROXY, 10) || process.env.TRUST_PROXY);
|
||||
}
|
||||
```
|
||||
|
||||
Le cast `parseInt(...) || process.env.TRUST_PROXY` permet de passer soit un entier (`"1"` → `1`) soit la chaîne `"true"`.
|
||||
|
||||
---
|
||||
|
||||
## SECRET
|
||||
|
||||
**Fichier concerné :** `src/config/index.js`
|
||||
**Utilisé par :** signature JWT, HMAC-SHA256 des API keys, secret de session Express
|
||||
|
||||
Valeur obligatoire en production — le process refuse de démarrer si elle est absente. Générer avec :
|
||||
|
||||
```bash
|
||||
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SESSION_SECRET
|
||||
|
||||
**Fichier concerné :** `src/createApp.js`
|
||||
**Utilisé par :** `express-session`
|
||||
|
||||
Indépendant de `SECRET` pour limiter la surface d'impact si l'un des deux est compromis. Même commande de génération que `SECRET`. Fallback sur `SECRET` si absent (rétrocompatibilité).
|
||||
|
||||
---
|
||||
|
||||
## ALLOWED_ORIGINS
|
||||
|
||||
**Fichier concerné :** `src/createApp.js`
|
||||
**Utilisé par :** CORS
|
||||
|
||||
Liste d'origines autorisées, séparées par des virgules. Si absente ou vide, CORS refuse toutes les origines cross-domain.
|
||||
|
||||
```
|
||||
ALLOWED_ORIGINS=http://localhost:4200,http://localhost:4300
|
||||
```
|
||||
|
||||
En production, indiquer uniquement le domaine du frontend (ex: `https://adastra.example.com`).
|
||||
Reference in New Issue
Block a user