Identidad y seguridad
La autenticación verifica quién eres. La autorización verifica qué puedes hacer.
Métodos de autenticación
| Método | Cuándo usar |
|---|
| OAuth | Login con Google, GitHub |
| Email/Password | Usuarios propios |
| Magic Links | Sin contraseñas |
| JWT | APIs stateless |
OAuth 2.0 Flow
Usuario → Tu app → Proveedor (Google)
↓
Usuario ← Tu app ← Token + Info
JWT (JSON Web Tokens)
// Estructura: header.payload.signature
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
// Contenido (payload)
{
"sub": "user123",
"email": "user@email.com",
"exp": 1699999999
}
Servicios recomendados
| Servicio | Tipo | Ideal para |
|---|
| Firebase Auth | BaaS | Apps móviles, web |
| Supabase Auth | BaaS | Full-stack |
| Auth0 | SaaS | Enterprise |
| NextAuth.js | Library | Next.js apps |
Seguridad básica
| Práctica | Por qué |
|---|
| HTTPS siempre | Encripta tráfico |
| Tokens cortos | Limita daño si roban |
| Refresh tokens | Renovar sin re-login |
| Rate limiting | Previene brute force |
🏦 Seguridad para Apps Financieras
Si tu app maneja dinero o datos financieros, necesitas medidas adicionales.
Checklist Obligatorio
| Requisito | Por qué | Estándar |
|---|
| ✅ MFA obligatorio | Regulación PSD2/Open Banking | NIST 800-63B |
| ✅ Logs inmutables | Auditoría ante reguladores | SOC 2 |
| ✅ Encriptación en reposo | Datos sensibles protegidos | PCI DSS |
| ✅ Sesiones con timeout | Prevención de fraude | OWASP |
| ✅ Rate limiting agresivo | Anti-scraping financiero | - |
¿Qué es PCI DSS?
Si tu app procesa, almacena o transmite datos de tarjetas de pago, debes cumplir con PCI DSS.
| Nivel | Transacciones/año | Requisitos |
|---|
| 4 | < 20,000 | SAQ (Self-Assessment) |
| 3 | 20,000 - 1M | SAQ + escaneo trimestral |
| 2 | 1M - 6M | SAQ + auditoría |
| 1 | > 6M | Auditoría completa anual |
💡 Tip: Usa Stripe, PayPal o MercadoPago para evitar manejar datos de tarjeta directamente. Ellos asumen el compliance.
Implementación MFA
// Verificar segundo factor antes de operaciones sensibles
async function requireMFA(userId: string, action: string) {
const user = await getUser(userId)
if (SENSITIVE_ACTIONS.includes(action) && !user.mfaVerifiedAt) {
throw new Error('MFA_REQUIRED')
}
// Log para auditoría
await auditLog({
userId,
action,
mfaVerified: true,
timestamp: new Date().toISOString(),
ip: request.ip
})
}
const SENSITIVE_ACTIONS = [
'TRANSFER_FUNDS',
'CHANGE_PASSWORD',
'ADD_BENEFICIARY',
'EXPORT_DATA'
]
Practica
→ Auth con Firebase Google