Usando variables de entorno en NodeJS
Usando dotenv
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.
- 🔒 Las
claves secretasDEBEN usarse en un servidor personalizado (p. ej., Node/Express/Heroku) para ocultar (proxiar) las solicitudes a servicios de API de terceros. - 🌍 Las
claves no secretasdescriben claves que pueden enviarse al navegador.
Nos centraremos en manejar 🔒
claves secretasusando 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:
- Reemplaza las claves codificadas de forma rígida con variables de entorno. Por ejemplo,
process.env.API_SECRET - Usa una biblioteca como
dotenvjunto con un archivo.env. Añade tus secretos previamente codificados de forma rígida al archivo.env. - ¡Verifica la línea
.enven tu archivo.gitignore!
¡NO crees un archivo
.enven 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.
.env./db/connection.js./api/users.js
Primero, instala el paquete dotenv.
npm install dotenvLuego, crea un archivo .env en la raíz de tu proyecto.
PGDATABASE="postgres"PGHOST="localhost"PGPORT=5234PGUSER="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:
# Actualiza automáticamente .gitignore# Ejecuta en terminal:[ "$(grep '^.env' .gitignore)" == "" ] && echo '.env' >> .gitignore# nota: no se imprimirá ninguna salidaEl archivo ./db/connection.js proporciona una instancia compartida de pg.Pool. Se usará para consultar la base de datos.
require('dotenv').config(); // ✅ Cargar archivo .envconst 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.
const db = require('../db/connection.js');
module.exports = { findUsername: function(username) { return db.query('SELECT * FROM users WHERE username=$1', username); }};- ¡Nunca comites tus claves secretas
.enva git! - No compartas archivos
.envcon el equipo. *
- Cada nueva computadora o escritorio de desarrollo debe generar nuevas claves y tokens de acceso.
Si no es posible, ten mucho cuidado al compartir tu
.env(en casos donde un servicio pueda invalidar todas las claves antiguas, o tengas tokens de acceso limitados para APIs pagas).
⚠️ 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! 🎉