Autenticación de Usuarios
Distinción Clave: OAuth 2.0 vs OpenID Connect (OIDC)
Sección titulada «Distinción Clave: OAuth 2.0 vs OpenID Connect (OIDC)»Antes de implementar cualquier patrón, es vital entender la diferencia (la confusión más común en la industria):
- OAuth 2.0 es para Autorización: Sirve para delegar acceso (ej. “Quiero que esta app lea mis correos”). Emite un
access_token(opaco para el cliente). No sirve para autenticar al usuario. - OpenID Connect (OIDC) es para Autenticación: Es una capa construida sobre OAuth 2.0. Emite un
id_token(un JWT) que contiene información firmada sobre quién es el usuario (nombre, email).
Regla de Oro HERA: Si necesitas saber quién es el usuario para iniciar una sesión en tu app, debes usar OIDC, validando el id_token.
Árbol de Decisión Canónico
Sección titulada «Árbol de Decisión Canónico»No todas las aplicaciones necesitan el mismo patrón de autenticación. Utiliza este árbol para elegir el camino correcto antes de iniciar el desarrollo.
1. Identity-Aware Proxy (IAP) — El Default Interno
Sección titulada «1. Identity-Aware Proxy (IAP) — El Default Interno»IAP es el estándar de oro en HERA para cualquier aplicación diseñada para empleados o colaboradores internos (Google Workspace). Actúa como un proxy de identidad a nivel del balanceador de carga.
Cuándo y Cómo Usarlo
Sección titulada «Cuándo y Cómo Usarlo»- Cuándo: Aplicaciones web internas expuestas a través de un Global External HTTPS Load Balancer (GCLB).
- Cómo: Se habilita en la consola de GCP o vía Terraform en el servicio backend. No requiere SDKs en tu código.
- Validación: El backend solo necesita validar el header criptográfico
X-Goog-IAP-JWT-Assertionpara confirmar la identidad, asegurando que el request pasó legítimamente por el proxy.
2. Identity Platform — Gestión Completa Externa
Sección titulada «2. Identity Platform — Gestión Completa Externa»Identity Platform es el servicio gestionado de Google (Customer Identity and Access Management - CIAM) para aplicaciones orientadas al consumidor (B2C) o partners externos.
Cuándo y Cómo Usarlo
Sección titulada «Cuándo y Cómo Usarlo»- Cuándo: Tu aplicación requiere registro de usuarios, recuperación de contraseñas, validación por email/SMS, autenticación biométrica o MFA de múltiples factores para usuarios fuera de Grupo Herdez.
- Cómo: Se utilizan los SDKs de Firebase Authentication (Identity Platform es el motor enterprise de Firebase Auth).
3. OIDC Manual (Authorization Code + PKCE)
Sección titulada «3. OIDC Manual (Authorization Code + PKCE)»Si por restricciones de negocio no puedes usar IAP ni Identity Platform, y debes integrar un proveedor social o un IdP corporativo B2B externo, debes implementar el flujo de Authorization Code con PKCE (Proof Key for Code Exchange).
Queda estrictamente prohibido el uso del Implicit Flow o retornar tokens directamente en la URL.
Generación Segura de Parámetros (CSPRNG)
Sección titulada «Generación Segura de Parámetros (CSPRNG)»Los parámetros state, nonce y code_verifier deben ser generados criptográficamente.
// Ejemplo en Node.js (Crypto nativo)const crypto = require('crypto');
// # simplificado para ilustración - En producción, encapsular en un módulo corefunction generateOidcParameters() { const codeVerifier = crypto.randomBytes(32).toString('base64url');
// PKCE Challenge (S256) const codeChallenge = crypto .createHash('sha256') .update(codeVerifier) .digest('base64url');
const state = crypto.randomBytes(16).toString('hex'); const nonce = crypto.randomBytes(16).toString('hex');
return { codeVerifier, codeChallenge, state, nonce };}Python (secrets + hashlib)
import secretsimport hashlibimport base64
def generate_oidc_parameters(): code_verifier = secrets.token_urlsafe(32)
# PKCE Challenge (S256) code_challenge = base64.urlsafe_b64encode( hashlib.sha256(code_verifier.encode()).digest() ).rstrip(b"=").decode()
state = secrets.token_hex(16) nonce = secrets.token_hex(16)
return { "code_verifier": code_verifier, "code_challenge": code_challenge, "state": state, "nonce": nonce, }Las 8 Validaciones Obligatorias del id_token
Sección titulada «Las 8 Validaciones Obligatorias del id_token»Cuando el backend intercambia el code por los tokens de forma segura (Server-to-Server), debe validar criptográficamente el id_token recibido antes de confiar en él:
- Firma criptográfica: Validar la firma usando las claves públicas del IdP (JWKS).
- Issuer (
iss): Confirmar que el emisor es exactamente el IdP esperado. - Audience (
aud): Confirmar que tu aplicación (Client ID) es el destinatario previsto. - Expiración (
exp): Rechazar tokens caducados. - Not Before (
nbf/iat): El token no puede usarse antes de su emisión. - Nonce (
nonce): Debe coincidir con el generado en la Fase 1 para mitigar ataques de repetición. - Dominio corporativo (
hd): Si es un login interno, validar que el claimhd(Hosted Domain) esgrupoherdez.com.mx. - Email verificado (
email_verified): Garantizar que el IdP verificó la propiedad del correo.
Session Management Seguro
Sección titulada «Session Management Seguro»El id_token y el access_token no deben ser enviados al navegador para almacenamiento en localStorage.
- El backend valida el
id_token. - El backend crea una sesión local (en base de datos o Redis).
- El backend envía una Cookie de sesión opaca,
HttpOnly,SecureySameSite=Lax/Strictal navegador.
Defense in Depth en el Callback
Sección titulada «Defense in Depth en el Callback»El endpoint del backend que recibe el redirect (/auth/callback) es un vector crítico. Protege esta ruta:
- Implementa Rate Limiting estricto en el WAF (Cloud Armor).
- Valida que el parámetro
staterecibido coincida exactamente con el guardado en la cookie (encriptada) de la sesión previa. - Maneja correctamente los errores del IdP (
error=access_denied) sin filtrar información interna.
Antipatrones Prohibidos
Sección titulada «Antipatrones Prohibidos»Lista de Verificación (Checklist) para MRs
Sección titulada «Lista de Verificación (Checklist) para MRs»Antes de aprobar un Merge Request que implemente autenticación manual (OIDC), el Tech Lead debe validar mecánicamente:
- Se utiliza Authorization Code Flow con PKCE (nunca Implicit).
- Los parámetros
state,nonceycode_verifierse generan con un CSPRNG. - El intercambio del
codepor tokens se realiza Server-to-Server. - El backend valida obligatoriamente la firma,
iss,aud,expynoncedelid_token. - Si aplica, el backend valida el claim
hd(Hosted Domain) para restringir el acceso corporativo. - La sesión se maneja mediante Cookies
HttpOnly,SecureySameSite. - El
client_secretde OIDC se consume vía variable de entorno inyectada desde Secret Manager (cero credenciales en código). - Los scopes solicitados son estrictamente los mínimos necesarios (Incremental Authorization).
- La comunicación del backend con APIs de Google utiliza Workload Identity (sin claves JSON).