codigo0/backend/src/config/security.ts

64 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-01-19 08:10:16 +00:00
/**
* Configuración de Seguridad
* Valida variables de entorno críticas al startup
*/
import dotenv from 'dotenv';
dotenv.config();
interface SecurityConfig {
JWT_SECRET: string;
JWT_EXPIRES_IN: string;
WEBHOOK_SECRET: string;
}
/**
* Validar configuración de seguridad
* Si alguna variable crítica falta, la app no arranca
*/
export function validateSecurityConfig(): SecurityConfig {
const errors: string[] = [];
// JWT_SECRET es crítico - debe existir y no ser el valor por defecto
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) {
errors.push('JWT_SECRET no está configurado en .env');
console.error('❌ CRÍTICO: JWT_SECRET no configurado');
console.error(' Generar con: openssl rand -base64 32');
} else if (JWT_SECRET === 'emerges-tes-secret-key-change-in-production') {
errors.push('JWT_SECRET está usando el valor por defecto inseguro');
console.error('❌ CRÍTICO: JWT_SECRET usa valor por defecto inseguro');
console.error(' Generar un secret seguro con: openssl rand -base64 32');
console.error(' Y actualizarlo en .env');
} else if (JWT_SECRET.length < 32) {
errors.push('JWT_SECRET debe tener al menos 32 caracteres');
console.error('❌ CRÍTICO: JWT_SECRET demasiado corto (mínimo 32 caracteres)');
}
// WEBHOOK_SECRET es crítico en producción
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET;
if (process.env.NODE_ENV === 'production' && !WEBHOOK_SECRET) {
errors.push('WEBHOOK_SECRET no configurado en producción');
console.error('❌ CRÍTICO: WEBHOOK_SECRET no configurado en producción');
}
// Si hay errores críticos, salir
if (errors.length > 0) {
console.error('\n🚨 ERRORES DE SEGURIDAD ENCONTRADOS:');
errors.forEach((error, index) => {
console.error(` ${index + 1}. ${error}`);
});
console.error('\n⚠ La aplicación no puede iniciarse con estos errores de seguridad.\n');
process.exit(1);
}
console.log('✅ Variables de seguridad validadas correctamente');
return {
JWT_SECRET: JWT_SECRET || '',
JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '24h',
WEBHOOK_SECRET: WEBHOOK_SECRET || '',
};
}