🔐

Autenticación

👨‍🍳 Chef

Identidad y seguridad

La autenticación verifica quién eres. La autorización verifica qué puedes hacer.


Métodos de autenticación

MétodoCuándo usar
OAuthLogin con Google, GitHub
Email/PasswordUsuarios propios
Magic LinksSin contraseñas
JWTAPIs 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

ServicioTipoIdeal para
Firebase AuthBaaSApps móviles, web
Supabase AuthBaaSFull-stack
Auth0SaaSEnterprise
NextAuth.jsLibraryNext.js apps

Seguridad básica

PrácticaPor qué
HTTPS siempreEncripta tráfico
Tokens cortosLimita daño si roban
Refresh tokensRenovar sin re-login
Rate limitingPreviene brute force

🏦 Seguridad para Apps Financieras

Si tu app maneja dinero o datos financieros, necesitas medidas adicionales.

Checklist Obligatorio

RequisitoPor quéEstándar
✅ MFA obligatorioRegulación PSD2/Open BankingNIST 800-63B
✅ Logs inmutablesAuditoría ante reguladoresSOC 2
✅ Encriptación en reposoDatos sensibles protegidosPCI DSS
✅ Sesiones con timeoutPrevención de fraudeOWASP
✅ Rate limiting agresivoAnti-scraping financiero-

¿Qué es PCI DSS?

Si tu app procesa, almacena o transmite datos de tarjetas de pago, debes cumplir con PCI DSS.

NivelTransacciones/añoRequisitos
4< 20,000SAQ (Self-Assessment)
320,000 - 1MSAQ + escaneo trimestral
21M - 6MSAQ + auditoría
1> 6MAuditorí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