Node.js: Manejar secretos
Cómo manejar secretos con Node.js
👋 ¡Bienvenido a la documentación de Stackhero!
Stackhero ofrece una solución nube de Node.js lista para usar que proporciona una serie de beneficios, incluyendo:
- Despliegue su aplicación en segundos con un simple
git push.- Use su propio nombre de dominio y benefíciese de la configuración automática de certificados HTTPS para una mayor seguridad.
- Disfrute de la tranquilidad con copias de seguridad automáticas, actualizaciones con un clic, y precios sencillos, transparentes y predecibles.
- Obtenga un rendimiento óptimo y una seguridad robusta gracias a una VM privada y dedicada.
Ahorre tiempo y simplifique su vida: ¡solo toma 5 minutos probar la solución de alojamiento en la nube de Node.js de Stackhero!
Cuando su proyecto de Node.js interactúa con una base de datos, almacenamiento de objetos o una API externa, almacenar de manera segura credenciales como nombres de usuario, contraseñas o tokens, a menudo llamados "secretos", es crucial. Mantener estos secretos confidenciales es fundamental para mantener la seguridad.
Lo que podría estar tentado a hacer
Podría inicialmente considerar algo como esto:
// Conectando a una base de datos PostgreSQL
const pg = new Client({
host: 'xxxxx.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Desafortunadamente, este método no es seguro. ¿Por qué? Porque sus secretos podrían terminar en su repositorio de Git, exponiéndolos a cualquiera con acceso. Incluso si piensa que solo usted tiene acceso, es como dejar un Post-it con sus contraseñas en su monitor y asumir que nadie más lo verá. Esto eventualmente puede llevar a problemas de seguridad.
Además, este enfoque no admite una gestión fluida de diferentes entornos, como desarrollo y producción.
Las variables de entorno
Una práctica ampliamente adoptada en la industria es almacenar secretos en variables de entorno.
Las variables de entorno se definen fuera de su código y se configuran antes de que Node.js comience. El concepto es definir todos sus secretos usando variables de entorno, evitando codificarlos directamente en su aplicación.
Definir sus primeras variables de entorno
Para definir una variable de entorno, puede configurarla al inicio de su invocación de Node.js así: MY_PASSWORD=myDevelopmentPassword node app.js
Este comando establece una variable llamada "MY_PASSWORD" con el valor "myDevelopmentPassword". El formato es simplemente <KEY>=<value>.
Por convención, las variables de entorno se escriben en letras mayúsculas. Tenga en cuenta que solo se pueden utilizar cadenas de texto, no matrices u objetos.
Leer variables de entorno
En su archivo app.js, puede leer su nueva variable de entorno con process.env así: console.log(process.env.MY_PASSWORD);. Esto mostrará myDevelopmentPassword.
Ahora, la contraseña está definida fuera del código, evitando que se publique en el repositorio de Git.
En Stackhero, en un entorno de producción, tiene la opción de definir una nueva variable de entorno llamada "MY_PASSWORD" que contenga "myProductionPassword" directamente en el panel de control de su servicio Node.js, asegurando un funcionamiento fluido.
Ejemplo de configuración de Node.js en el panel de control de Stackhero
En conclusión, su contraseña ya no se almacena en su código, y tiene contraseñas separadas para los entornos de desarrollo y producción.
Usar la biblioteca dotenv
En escenarios del mundo real, a menudo se deben gestionar múltiples secretos. Por ejemplo, conectarse a una base de datos requiere almacenar un nombre de host, un usuario y una contraseña.
Manejar un solo secreto es sencillo, pero gestionar varios puede volverse engorroso. Imagine iniciar su aplicación con esta línea de comando:
POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Esta línea es poco práctica y difícil de mantener. Una aplicación en producción podría requerir múltiples variables, haciendo que este enfoque sea impracticable.
Ahí es donde la biblioteca dotenv se vuelve invaluable.
Con dotenv, los secretos se pueden almacenar en un archivo separado llamado .env.
Primero, puede instalar la biblioteca dotenv con:
npm install dotenv
Luego, cree un archivo .env que contenga las variables:
POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Asegúrese de que este archivo .env no se suba al repositorio de Git agregándolo a la lista de archivos ignorados:
echo ".env" >> .gitignore
Finalmente, cargue la biblioteca dotenv al principio de su archivo app.js así:
require("dotenv").config();
Con esta configuración, al iniciar su aplicación con node app.js, dotenv leerá automáticamente el contenido del archivo .env en su plataforma de desarrollo. En producción, este archivo no existe, y las variables de entorno se obtienen directamente de la configuración de su servicio Node.js (disponible en el panel de control de Stackhero).
Ejemplo funcional
Todo esto era teoría. Pasemos a un ejemplo real.
Puede encontrar un ejemplo completo disponible aquí: https://github.com/stackhero-io/dotenvWithNodejs
Ahora sabe cómo manejar sus secretos de manera flexible y segura, todo de manera muy sencilla.