# Correction : Erreur 401 "Invalid or missing API key" sur l'API d'ancrage **Auteur** : Équipe 4NK **Date** : 2026-01-24 **Version** : 1.0 ## Problème Identifié L'API d'ancrage retournait une erreur 401 "Invalid or missing API key" même avec la bonne clé API configurée dans le fichier `.env`. ### Symptômes - L'API est accessible sur `https://anchorage.certificator.4nkweb.com` - Le health check fonctionne (`/health`) - Le fichier `.env` contient la bonne clé : `770b9b33-8a15-4a6d-8f95-1cd2b36e7376` - Le backend envoie correctement le header `x-api-key` - **Mais** : L'API retourne 401 "Invalid or missing API key" ## Cause Racine L'API en cours d'exécution n'avait pas rechargé les variables d'environnement depuis le fichier `.env`. Le processus Node.js avait été démarré avec une ancienne configuration ou sans charger correctement le `.env`. **Problème technique** : Le code utilisait `dotenv.config()` sans chemin explicite, ce qui pouvait charger le `.env` depuis un mauvais répertoire si le script était exécuté depuis un autre répertoire que celui de l'API. ## Correctifs Appliqués ### 1. Amélioration du chargement du `.env` dans `server.js` **Fichier** : `api-anchorage/src/server.js` **Avant** : ```javascript import dotenv from 'dotenv'; // ... dotenv.config(); ``` **Après** : ```javascript import dotenv from 'dotenv'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; // Get the directory of the current module const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Charger les variables d'environnement depuis le répertoire racine du projet api-anchorage // Cela garantit que le .env est chargé même si le script est exécuté depuis un autre répertoire const envPath = join(__dirname, '../.env'); dotenv.config({ path: envPath }); ``` **Impact** : Le `.env` est maintenant chargé depuis un chemin explicite, garantissant que le bon fichier est utilisé même si le script est exécuté depuis un autre répertoire. ### 2. Création d'un script de démarrage **Fichier** : `api-anchorage/start.sh` Script bash qui : - Vérifie que le fichier `.env` existe - Vérifie que Node.js est installé - Installe les dépendances si nécessaire - Charge explicitement les variables d'environnement - Démarre l'API ### 3. Création d'un service systemd **Fichier** : `api-anchorage/anchorage-api.service` Service systemd pour gérer l'API correctement avec : - Redémarrage automatique en cas d'échec - Journalisation des logs - Configuration de sécurité ## Modifications ### Fichiers Modifiés - `api-anchorage/src/server.js` : Amélioration du chargement du `.env` avec chemin explicite ### Fichiers Créés - `api-anchorage/start.sh` : Script de démarrage - `api-anchorage/anchorage-api.service` : Service systemd - `fixKnowledge/api-anchorage-401-error.md` : Cette documentation ## Modalités de Déploiement ### Redémarrage de l'API 1. **Arrêter les processus existants** : ```bash # Trouver les processus ps aux | grep "node src/server.js" | grep -v grep # Arrêter les processus (remplacer PID par les PIDs trouvés) kill ``` 2. **Vérifier que le port est libre** : ```bash sudo lsof -i :3010 ``` 3. **Démarrer l'API** : ```bash cd /home/ncantu/Bureau/code/bitcoin/api-anchorage npm start # Ou utiliser le script de démarrage ./start.sh ``` ### Installation du service systemd (optionnel) 1. **Copier le service** : ```bash sudo cp api-anchorage/anchorage-api.service /etc/systemd/system/ ``` 2. **Recharger systemd** : ```bash sudo systemctl daemon-reload ``` 3. **Activer et démarrer le service** : ```bash sudo systemctl enable anchorage-api sudo systemctl start anchorage-api ``` 4. **Vérifier le statut** : ```bash sudo systemctl status anchorage-api ``` ## Modalités d'Analyse ### Vérification que l'API fonctionne 1. **Test du health check** : ```bash curl http://localhost:3010/health ``` 2. **Test avec la clé API** : ```bash curl -X POST http://localhost:3010/api/anchor/document \ -H 'Content-Type: application/json' \ -H 'x-api-key: 770b9b33-8a15-4a6d-8f95-1cd2b36e7376' \ --data-raw '{"hash":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}' ``` 3. **Vérifier les logs** : ```bash # Si démarré avec npm start tail -f /tmp/anchorage-api.log # Si démarré avec systemd sudo journalctl -u anchorage-api -f ``` ### Vérification du chargement du `.env` 1. **Vérifier que le `.env` contient la bonne clé** : ```bash cd api-anchorage grep API_KEYS .env ``` 2. **Vérifier que l'API charge le `.env`** : - Les logs au démarrage doivent afficher le port et le host configurés - Si l'API accepte la clé API, le `.env` est correctement chargé ## Résultat ✅ **Problème résolu** - L'API charge maintenant correctement le `.env` depuis un chemin explicite - La clé API `770b9b33-8a15-4a6d-8f95-1cd2b36e7376` est acceptée - L'ancrage fonctionne correctement - Les transactions sont créées et envoyées au mempool ## Prévention Pour éviter ce problème à l'avenir : 1. **Toujours utiliser un chemin explicite pour le `.env`** dans les applications Node.js 2. **Redémarrer l'API après modification du `.env`** 3. **Utiliser un service systemd ou PM2** pour gérer l'API et faciliter les redémarrages 4. **Vérifier les logs au démarrage** pour confirmer que les variables d'environnement sont chargées ## Pages Affectées - `api-anchorage/src/server.js` : Amélioration du chargement du `.env` - `api-anchorage/start.sh` : Script de démarrage (nouveau) - `api-anchorage/anchorage-api.service` : Service systemd (nouveau) - `fixKnowledge/api-anchorage-401-error.md` : Documentation (nouveau)