Node.js: Gérer les secrets
Comment gérer les secrets avec Node.js
👋 Bienvenue sur la documentation de Stackhero !
Stackhero propose une solution Node.js cloud prête à l'emploi qui offre de nombreux avantages, notamment :
- Déployez votre application en quelques secondes avec un simple
git push.- Utilisez votre propre nom de domaine et bénéficiez de la configuration automatique des certificats HTTPS pour une sécurité renforcée.
- Profitez de la tranquillité d'esprit avec des sauvegardes automatiques, des mises à jour en un clic, et une tarification simple, transparente et prévisible.
- Obtenez des performances optimales et une sécurité robuste grâce à une VM privée et dédiée.
Gagnez du temps et simplifiez-vous la vie : il ne faut que 5 minutes pour essayer la solution d'hébergement cloud Node.js de Stackhero !
Lorsque votre projet Node.js interagit avec une base de données, un object storage ou une API externe, il est essentiel de stocker les identifiants, comme les noms d'utilisateur, mots de passe ou tokens, de manière sécurisée. Ces identifiants sont souvent appelés "secrets". Protéger vos secrets est indispensable pour garantir la sécurité de votre application.
Ce que vous pourriez être tenté de faire
Au début, vous pourriez envisager d'écrire vos identifiants directement dans votre code, comme ceci :
// Connexion à une base de données PostgreSQL
const pg = new Client({
host: '<XXXXXX>.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Cependant, cette méthode n'est pas sécurisée. Vos secrets risquent de se retrouver dans votre dépôt Git, les rendant accessibles à toute personne ayant accès au code. Même si vous pensez être le seul à y accéder, c'est un peu comme laisser un Post-it avec vos mots de passe sur votre écran en espérant que personne ne le remarque. Cela peut finir par entraîner de vrais problèmes de sécurité.
De plus, coder en dur vos secrets complique la gestion de différents environnements, comme le développement et la production.
Les variables d'environnement
Une bonne pratique largement adoptée dans l'industrie consiste à stocker les secrets dans des variables d'environnement.
Les variables d'environnement sont définies en dehors de votre code et sont positionnées avant le démarrage de Node.js. L'idée est de définir tous vos secrets via des variables d'environnement, afin qu'ils ne soient jamais inscrits en dur dans votre application.
Définir vos premières variables d'environnement
Vous pouvez définir une variable d'environnement en la passant au lancement de votre commande Node.js, comme ceci :
MY_PASSWORD=myDevelopmentPassword node app.js
Cette commande crée une variable appelée MY_PASSWORD avec la valeur myDevelopmentPassword. Le format est simple : <KEY>=<valeur>.
Par convention, les variables d'environnement sont écrites en majuscules. Notez que ces variables ne peuvent contenir que des chaînes de caractères, pas de tableaux ni d'objets.
Lire les variables d'environnement
Dans votre fichier app.js, vous pouvez accéder à votre variable d'environnement via process.env, comme ceci :
console.log(process.env.MY_PASSWORD);
Cela affichera myDevelopmentPassword.
Votre mot de passe est maintenant défini en dehors de votre code. Cela permet d'éviter qu'il ne se retrouve par inadvertance dans votre dépôt Git.
Si vous utilisez Stackhero en production, vous pouvez définir une nouvelle variable d'environnement nommée MY_PASSWORD avec la valeur myProductionPassword directement depuis le tableau de bord de votre service Node.js. Cela facilite la gestion fluide des différents environnements.
Exemple de configuration Node.js sur le tableau de bord Stackhero
Avec cette méthode, votre mot de passe n'est plus stocké dans votre code, et vous pouvez facilement utiliser des identifiants différents pour les environnements de développement et de production.
Utiliser la bibliothèque dotenv
Dans des projets réels, il est fréquent de devoir gérer plusieurs secrets. Par exemple, se connecter à une base de données nécessite souvent un hostname, un nom d'utilisateur et un mot de passe.
Gérer un seul secret est simple, mais jongler avec plusieurs devient vite compliqué. Imaginez démarrer votre application avec une commande comme celle-ci :
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Cela devient rapidement difficile à lire et à maintenir. En production, vous aurez probablement encore plus de variables, ce qui rend cette approche peu pratique.
C'est là que la bibliothèque dotenv intervient.
Avec dotenv, vous pouvez stocker vos secrets dans un fichier séparé appelé .env.
Pour commencer, installez la bibliothèque dotenv en lançant :
npm install dotenv
Ensuite, créez un fichier .env pour y placer vos variables :
POSTGRESQL_HOST=<XXXXXX>.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Pour sécuriser vos secrets, assurez-vous que votre fichier .env n'est pas ajouté à votre dépôt Git. Pour cela, ajoutez-le à votre fichier .gitignore :
echo ".env" >> .gitignore
Enfin, chargez la bibliothèque dotenv en haut de votre fichier app.js :
require("dotenv").config();
Avec cette configuration, lorsque vous lancez votre application avec node app.js, dotenv lit automatiquement votre fichier .env sur votre machine de développement. En production, vous n'avez pas besoin du fichier .env. Les variables d'environnement sont directement récupérées depuis la configuration de votre service Node.js, que vous pouvez gérer via le tableau de bord Stackhero.
Exemple fonctionnel
Maintenant que nous avons vu la théorie, passons à un exemple concret.
Vous pouvez retrouver un exemple complet et fonctionnel ici : https://github.com/stackhero-io/dotenvWithNodejs
Grâce à ces techniques, vous pouvez gérer vos secrets de façon flexible et sécurisée, tout en gardant le processus simple et efficace.