Skip to Content

Login alojado (Universal Login)

El problema: ¿dónde debe vivir el formulario de inicio de sesión?

Toda aplicación que autentica usuarios debe decidir dónde vive el formulario de inicio de sesión. Existen tres enfoques fundamentales, y la elección tiene profundas implicaciones de seguridad.

Login incrustado (el enfoque arriesgado)

La aplicación renderiza su propio formulario de inicio de sesión y recoge las credenciales directamente. El JavaScript de tu aplicación puede leer los campos del formulario, interceptar pulsaciones de teclas y acceder a las credenciales.

Login alojado (el enfoque seguro)

Las credenciales se introducen en un origen diferente — controlado completamente por el proveedor de identidad. El JavaScript de tu aplicación no puede leer los campos del formulario, interceptar pulsaciones de teclas ni acceder a las credenciales de ninguna forma. La política de mismo origen del navegador aplica este límite automáticamente.

RiesgoLogin incrustadoLogin alojado
XSS roba credencialesSí — tu JS puede leer el campo de contraseñaNo — origen diferente, tu JS no puede acceder a él
Script de terceros lee credencialesSí — cualquier script en tu bundle se ejecuta en el mismo origenNo — los scripts de terceros en tu origen no pueden alcanzar la página de autenticación
Phishing de credenciales via manipulación DOMSí — un atacante puede modificar tu formulario de loginNo — la página de login está en el dominio del IdP
Ámbito de autocompletado del gestor de contraseñasTu dominioEl dominio del IdP (consistente entre todas las apps)
Aplicación de MFADebes implementarloEl IdP lo gestiona de forma transparente
Integración de social loginDebes integrar cada proveedorEl IdP presenta todos los proveedores configurados
Ámbito de auditoría de conformidadToda tu aplicaciónSolo las páginas de login del IdP

El Login Alojado es el enfoque recomendado por el OAuth 2.0 Security Best Current Practice (RFC 6819). Auth0 lo llama “Universal Login”, Okta lo llama “Okta-hosted Sign-In” y Auris lo llama “Hosted Login”. El principio de seguridad es el mismo: nunca dejes que tu aplicación toque las credenciales sin procesar.

Cómo funciona: el flujo completo

El Login Alojado de Auris implementa el flujo OAuth2 Authorization Code con PKCE (RFC 7636). Aquí está la secuencia completa, paso a paso:

  1. Tu aplicación genera un code verifier y un code challenge (PKCE S256)
  2. El navegador es redirigido a la página de login alojada de Auris con el code challenge
  3. Auris almacena el code challenge en una OAuthSession de servidor
  4. El usuario introduce credenciales, completa el MFA si es necesario
  5. Auris valida las credenciales contra Keycloak
  6. Si la autenticación es exitosa, el motor de Actions ejecuta los hooks post-login
  7. Auris redirige de vuelta a tu app con un código de autorización de un solo uso
  8. Tu app intercambia el código + code verifier por tokens
  9. Auris verifica que SHA256(code_verifier) === stored_code_challenge
  10. Se emiten access token, refresh token e ID token

Gestión de sesiones

Auris utiliza dos modelos del lado del servidor para gestionar el flujo de login alojado:

OAuthSession

Una OAuthSession es una sesión de flujo temporal que existe durante la redirección de autorización. Se crea en el paso 1 y se destruye en el paso 8.

CampoPropósito
stateToken CSRF para validar la redirección
codeChallengeEl hash PKCE para verificación posterior
redirectUriEl redirect_uri registrado
scopeLos scopes solicitados
expiresAtTTL de 10 minutos — los flujos incompletos se limpian automáticamente

UserSession

Una UserSession se crea después de la autenticación exitosa y persiste durante toda la sesión del usuario. Contiene el access token actual, refresh token, familia de tokens y metadatos del dispositivo.

Pipeline de seguridad

Cada intento de login pasa por un pipeline de seguridad completo:

  1. Validación de parámetros: state, code_challenge, redirect_uri, client_id
  2. Verificación de credenciales: contraseña, magic link, OTP, WebAuthn, social token
  3. Puntuación de riesgo adaptativo: IP, dispositivo, geo, comportamiento
  4. Evaluación de MFA: ¿se requiere un factor adicional según la política y la puntuación de riesgo?
  5. Motor de Actions: ejecuta los hooks post-autenticación del tenant
  6. Emisión de tokens: genera access token con claims, incluyendo los custom claims configurados

El motor de Actions puede rechazar el login devolviendo { success: false } desde un hook. Esto permite que los tenants implementen lógica de bloqueo personalizada — por ejemplo, bloquear usuarios de ciertos países o sin un atributo de perfil requerido.