Seguridad
Camarauth SDK implementa múltiples capas de seguridad para proteger la autenticación de tus usuarios.
Principios de Seguridad
Zero Trust No confiamos en ningún input hasta validarlo
Defense in Depth Múltiples capas de protección
Least Privilege Mínimos privilegios necesarios
Fail Secure Si algo falla, lo hace de forma segura
Capas de Seguridad
1. Rate Limiting
Protección contra fuerza bruta y abuso:
const backend = new CamarauthBackend ({
rateLimit: {
enabled: true ,
windowMs: 60000 , // 1 minuto
maxRequests: 100 , // 100 requests
strictLogin: true // 5 requests para login
}
});
Rate limiting por IP y endpoint. El endpoint de login tiene límites más estrictos.
2. Validación de Webhooks
Verificación de firma HMAC para webhooks de Evolution API:
const backend = new CamarauthBackend ({
webhookSecret: process . env . EVOLUTION_WEBHOOK_SECRET ,
webhookSignatureHeader: 'x-hub-signature-256'
});
El backend verifica:
const expectedSignature = createHmac ( 'sha256' , secret )
. update ( rawBody )
. digest ( 'hex' );
// Timing-safe comparison
if ( ! timingSafeEqual (
Buffer . from ( expectedSignature , 'hex' ),
Buffer . from ( providedSignature , 'hex' )
)) {
throw new Error ( 'Firma inválida' );
}
3. JWT Seguros
Tokens con expiración y firma:
// Access token (15 minutos)
const accessToken = jwt . sign (
{ userId , roles },
JWT_SECRET ,
{
expiresIn: '15m' ,
issuer: 'camarauth' ,
audience: 'camarauth-client'
}
);
// Refresh token (7 días)
const refreshToken = jwt . sign (
{ userId , type: 'refresh' , jti: uuid () },
JWT_SECRET ,
{ expiresIn: '7d' }
);
4. CORS Estricto
const backend = new CamarauthBackend ({
corsOrigins: [
'https://miapp.com' , // Dominio principal
'https://app.miapp.com' , // Subdominio
'https://admin.miapp.com' // Panel admin
]
});
Nunca uses * en producción. Especifica explícitamente los orígenes permitidos.
Todos los inputs son validados:
// Validación de PIN
if ( ! pin || pin . length !== 6 ) {
throw new ValidationError ( 'PIN inválido' );
}
// Validación de teléfono
if ( ! / ^ \+ [ 1-9 ] \d {1,14} $ / . test ( phoneNumber )) {
throw new ValidationError ( 'Teléfono inválido' );
}
// Sanitización de queries SQL
const result = await db . query (
'SELECT * FROM users WHERE id = $1' ,
[ userId ] // Parameterized query
);
6. Expiración de PINs
Los PINs tienen vida corta por diseño:
{
pin : 'ABC123' ,
createdAt : Date . now (),
expiresAt : Date . now () + ( 3 * 60 * 1000 ), // 3 minutos
status : 'pending'
}
Beneficios:
Ventana de ataque reducida
Fuerza al atacante a actuar rápido
Limpieza automática de datos antiguos
7. HTTPS/TLS
Obligatorio en producción:
import https from 'https' ;
import fs from 'fs' ;
const options = {
key: fs . readFileSync ( '/path/to/privkey.pem' ),
cert: fs . readFileSync ( '/path/to/fullchain.pem' )
};
https . createServer ( options , app ). listen ( 443 );
import helmet from 'helmet' ;
app . use ( helmet ({
contentSecurityPolicy: {
directives: {
defaultSrc: [ "'self'" ],
connectSrc: [ "'self'" , "wss:" , "https:" ],
imgSrc: [ "'self'" , "data:" , "https:" ],
scriptSrc: [ "'self'" ],
styleSrc: [ "'self'" , "'unsafe-inline'" ]
}
},
hsts: {
maxAge: 31536000 ,
includeSubDomains: true ,
preload: true
},
referrerPolicy: { policy: 'same-origin' }
}));
Almacenamiento Seguro
JWT en Frontend
// ❌ No recomendado
localStorage . setItem ( 'token' , token );
// ✅ Recomendado - httpOnly cookies
res . cookie ( 'token' , token , {
httpOnly: true ,
secure: true , // Solo HTTPS
sameSite: 'strict' ,
maxAge: 15 * 60 * 1000 // 15 minutos
});
// O usar memory + refresh token
const storage = createAuthStorage ({
storage: memoryStorage // No persiste en disco
});
Contraseñas y Secrets
# ❌ No hardcodear
const JWT_SECRET = 'mi-secreto' ;
# ✅ Variables de entorno
const JWT_SECRET = process.env.JWT_SECRET ;
# ✅ Longitud mínima
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 64
Auditoría y Logs
const logger = createProductionLogger ();
// Log de eventos de seguridad
logger . info ( 'PIN registrado' , {
pinId: pin . id ,
ip: req . ip ,
userAgent: req . headers [ 'user-agent' ],
timestamp: new Date (). toISOString ()
});
logger . warn ( 'Rate limit exceeded' , {
ip: req . ip ,
endpoint: req . path ,
attempts: rateLimitData . count
});
logger . error ( 'Invalid webhook signature' , {
ip: req . ip ,
signature: req . headers [ 'x-hub-signature-256' ]
});
Checklist de Seguridad
Backend Frontend Infraestructura
Vulnerabilidades Comunes y Prevención
XSS (Cross-Site Scripting)
function UserProfile ({ user }) {
return < div dangerouslySetInnerHTML = { { __html: user . bio } } /> ;
}
CSRF (Cross-Site Request Forgery)
// Protección con SameSite cookies
res . cookie ( 'session' , token , {
sameSite: 'strict' , // o 'lax'
httpOnly: true ,
secure: true
});
// O usar CSRF tokens
app . use ( csrf ());
SQL Injection
const query = `SELECT * FROM users WHERE id = ' ${ userId } '` ;
Man-in-the-Middle
// Forzar HTTPS
if ( process . env . NODE_ENV === 'production' && ! req . secure ) {
return res . redirect ( 301 , `https:// ${ req . headers . host }${ req . url } ` );
}
Reportar Vulnerabilidades
Si encuentras una vulnerabilidad de seguridad:
NO abras un issue público
Envía un email a: security@camarauth.com
Incluye:
Descripción del problema
Pasos para reproducir
Impacto potencial
Sugerencias de mitigación (opcional)
Respondemos a reportes de seguridad en menos de 48 horas.
Recursos Adicionales