- Nouvelle architecture modulaire avec src/api, src/core, src/utils - Séparation claire docs/ (admin, changelog, dev, security) et tests/ (unit, integration, scripts) - server.js devient un simple point d'entrée - Ajout de STRUCTURE.md documentant l'architecture - Archivage ancien-confluent/ avec générateur de lexique complet 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.6 KiB
Test de Sécurité - Full Lockdown
🎯 Objectif
Vérifier que TOUS les endpoints sont sécurisés et nécessitent une authentification.
🔐 Système d'authentification
Endpoints publics (pas d'auth)
GET /api/health- Health check (status: ok)GET /- Page HTML statique
Endpoints protégés (auth requise)
Tous les autres endpoints nécessitent le header x-api-key avec un token valide.
📋 Checklist de test
1. Démarrage initial
cd ConfluentTranslator
npm start
Attendu : Le serveur démarre et affiche :
- Port d'écoute (3000)
- Nombre d'entrées lexique chargées
- IMPORTANT : Message de création du token admin si
data/tokens.jsonest vide
2. Accès sans authentification
Test : Ouvrir http://localhost:3000 dans le navigateur
Attendu :
- ✅ La page HTML se charge
- ✅ L'overlay de connexion est affiché (fond noir avec modal bleu)
- ✅ Un champ "API Key" et un bouton "Se connecter"
Vérification : Aucune donnée ne doit être chargée dans les onglets (stats, lexique)
3. Test d'authentification invalide
Test : Entrer une fausse clé API (ex: test-123)
Attendu :
- ❌ Message d'erreur "Clé API invalide"
- ❌ L'overlay reste affiché
4. Récupération du token admin
Option A - Depuis les logs serveur :
# Chercher dans les logs du serveur au démarrage
grep "Admin token" logs.txt
Option B - Lire le fichier :
cat ConfluentTranslator/data/tokens.json
Format du fichier :
{
"c32b04be-2e68-4e15-8362-...": {
"name": "admin",
"role": "admin",
"enabled": true,
"createdAt": "2025-12-02T..."
}
}
5. Connexion avec token valide
Test : Copier le token admin et le coller dans le champ API Key
Attendu :
- ✅ Message de succès (ou disparition de l'overlay)
- ✅ Redirection vers l'interface principale
- ✅ Les données se chargent automatiquement (stats, lexique)
- ✅ Bouton "Déconnexion" visible en haut à droite
6. Vérification endpoints protégés
Test en ligne de commande (sans auth) :
# Test health (PUBLIC - devrait fonctionner)
curl http://localhost:3000/api/health
# Test stats (PROTÉGÉ - devrait échouer)
curl http://localhost:3000/api/stats
# Test lexique (PROTÉGÉ - devrait échouer)
curl http://localhost:3000/api/lexique/ancien
# Test traduction (PROTÉGÉ - devrait échouer)
curl -X POST http://localhost:3000/translate \
-H "Content-Type: application/json" \
-d '{"text":"bonjour","target":"ancien","provider":"anthropic","model":"claude-sonnet-4-20250514"}'
Attendu pour endpoints protégés :
{
"error": "API key missing"
}
Status HTTP: 401 Unauthorized
7. Vérification endpoints protégés (avec auth)
# Remplacer YOUR_TOKEN par le token admin
TOKEN="c32b04be-2e68-4e15-8362-..."
# Test stats (devrait fonctionner)
curl http://localhost:3000/api/stats \
-H "x-api-key: $TOKEN"
# Test lexique (devrait fonctionner)
curl http://localhost:3000/api/lexique/ancien \
-H "x-api-key: $TOKEN"
# Test validation (devrait fonctionner)
curl http://localhost:3000/api/validate \
-H "x-api-key: $TOKEN"
Attendu : Réponses JSON avec données complètes
8. Test de l'interface web
Test dans le navigateur (connecté) :
-
Onglet Stats
- ✅ Statistiques affichées
- ✅ Nombres de mots, racines, etc.
-
Onglet Lexique
- ✅ Recherche fonctionnelle
- ✅ Résultats affichés en temps réel
-
Onglet Traduction FR→CF
- ✅ Peut entrer du texte
- ✅ Bouton "Traduire" actif
- ✅ Traduction s'affiche (si API keys LLM configurées)
-
Onglet Traduction CF→FR
- ✅ Peut entrer du texte
- ✅ Bouton "Traduire" actif
- ✅ Traduction s'affiche
9. Test de déconnexion
Test : Cliquer sur "Déconnexion"
Attendu :
- ✅ Confirmation demandée
- ✅ Overlay de connexion réaffiché
- ✅ Données effacées de l'interface
- ✅ LocalStorage vidé (
confluentApiKeysupprimé)
10. Test de session expirée
Test :
- Se connecter
- Supprimer le token côté serveur (éditer
data/tokens.jsonet mettreenabled: false) - Tenter une action (ex: recherche lexique, traduction)
Attendu :
- ✅ Erreur "Session expirée"
- ✅ Déconnexion automatique
- ✅ Redirection vers overlay de connexion
🛡️ Liste complète des endpoints protégés
GET (lecture)
- ✅
/lexique- Auth requise - ✅
/api/lexique/:variant- Auth requise - ✅
/api/stats- Auth requise - ✅
/api/search- Auth requise - ✅
/api/validate- Auth requise
POST (écriture/actions)
- ✅
/translate- Auth + Rate limiting - ✅
/api/reload- Auth + Admin only - ✅
/api/debug/prompt- Auth requise - ✅
/api/analyze/coverage- Auth requise - ✅
/api/translate/raw- Auth + Rate limiting - ✅
/api/translate/batch- Auth + Rate limiting - ✅
/api/translate/conf2fr- Auth + Rate limiting - ✅
/api/translate/conf2fr/llm- Auth + Rate limiting - ✅
/api/admin/*- Auth + Admin only
📊 Résultats attendus
✅ SUCCÈS si :
- Tous les endpoints protégés retournent 401 sans token
- Tous les endpoints protégés fonctionnent avec token valide
- Interface web bloque l'accès sans connexion
- Déconnexion fonctionne correctement
- Sessions expirées sont gérées automatiquement
❌ ÉCHEC si :
- Un endpoint protégé répond sans token
- L'interface charge des données sans connexion
- Les erreurs d'auth ne déconnectent pas automatiquement
🚀 Commandes rapides
# Démarrer le serveur
npm start
# Vérifier les tokens
cat data/tokens.json
# Créer un nouveau token (si admin token perdu)
# Supprimer data/tokens.json et redémarrer le serveur
rm data/tokens.json
npm start
# Tester tous les endpoints publics
curl http://localhost:3000/api/health
# Tester tous les endpoints protégés (sans auth - doit échouer)
curl http://localhost:3000/api/stats
curl http://localhost:3000/api/lexique/ancien
# Tester avec auth (doit réussir)
TOKEN="votre-token-ici"
curl http://localhost:3000/api/stats -H "x-api-key: $TOKEN"
🔧 Dépannage
Problème : Pas de token admin créé
- Solution : Supprimer
data/tokens.jsonet redémarrer
Problème : 401 même avec token valide
- Solution : Vérifier que le token est actif (
enabled: true) - Vérifier le format du header :
x-api-key(minuscules, avec tirets)
Problème : Interface ne se charge pas
- Solution : Vérifier que
public/index.htmlest accessible - Vérifier les logs serveur pour erreurs
Problème : Rate limiting bloque les requêtes
- Solution : Attendre 1 minute ou redémarrer le serveur