DanLevy.net

Usando variables de entorno en NodeJS

Usando dotenv

Hero image for Usando variables de entorno en NodeJS

Manejo seguro de claves secretas y tokens de API

Artículo relacionado: Protege tus tokens

Repasemos rápidamente la diferencia entre clave secreta y clave no secreta.



Nos centraremos en manejar 🔒 claves secretas usando variables de entorno en este artículo.

Se incluyen ejemplos de código a continuación.

Visión general

Para acceder de forma segura a secretos en tu código NodeJS:

  1. Reemplaza las claves codificadas de forma rígida con variables de entorno. Por ejemplo, process.env.API_SECRET
  2. Usa una biblioteca como dotenv junto con un archivo .env. Añade tus secretos previamente codificados de forma rígida al archivo .env.
  3. ¡Verifica la línea .env en tu archivo .gitignore!

¡NO crees un archivo .env en servidores implementados. Usa las herramientas de gestión de variables de entorno proporcionadas por tus servicios de alojamiento (p. ej., Heroku, Netlify, AWS EC2): por ejemplo, panel de control o línea de comandos.

Ejemplo de código

Vamos a definir unos pocos archivos.

  1. .env
  2. ./db/connection.js
  3. ./api/users.js

Primero, instala el paquete dotenv.

Terminal window
npm install dotenv

Luego, crea un archivo .env en la raíz de tu proyecto.

.env
PGDATABASE="postgres"
PGHOST="localhost"
PGPORT=5234
PGUSER="postgres"
PGPASSWORD="password"

NUNCA comprometas el archivo .env.

❌ Evita crear .env en los servidores.

Revisa la documentación de tu proveedor de alojamiento para configurar variables de entorno.

Para asegurarte fácilmente de que tu .gitignore tiene una línea con .env:

Terminal window
# Actualiza automáticamente .gitignore
# Ejecuta en terminal:
[ "$(grep '^.env' .gitignore)" == "" ] && echo '.env' >> .gitignore
# nota: no se imprimirá ninguna salida

El archivo ./db/connection.js proporciona una instancia compartida de pg.Pool. Se usará para consultar la base de datos.

./db/connection.js
require('dotenv').config(); // ✅ Cargar archivo .env
const pg = require('pg');
const {PGUSER, PGHOST, PGPORT} = process.env;
if (process.env.NODE_ENV === 'development')
console.log(`Conectando a ${PGUSER} @ ${PGHOST}:${PGHOST}`);
// ^^ solo para mostrar variables de conexión de depuración
// pg usa automáticamente las variables de entorno PG*
module.exports = new pg.Pool();

La carpeta ./api contiene interfaces a tus tablas/vistas.

Aquí hay un ejemplo de ./api/users.js para la tabla users.

./api/users.js
const db = require('../db/connection.js');
module.exports = {
findUsername: function(username) {
return db.query('SELECT * FROM users WHERE username=$1', username);
}
};

⚠️ Importante: si es necesario, siempre usa un servicio de mensajería segura (preferiblemente con soporte para mensajes que expiran).

¡Buena suerte y avísame si tienes alguna pregunta! 🎉