Skip to Content

API de OAuth 2.0 Avanzado

Auris soporta varias extensiones avanzadas de OAuth 2.0 y OpenID Connect más allá del flujo estándar de Código de Autorización + PKCE. Estas capacidades están diseñadas para escenarios de autenticación empresariales y especializados:

  • Autorización de Dispositivos (RFC 8628) — para dispositivos con entrada limitada como CLIs, smart TVs e IoT
  • Intercambio de Tokens (RFC 8693) — para suplantación y delegación entre servicios
  • DPoP (RFC 9449) — para tokens vinculados al remitente resistentes al robo de tokens
  • CIBA (Autenticación Backchannel Iniciada por el Cliente) — para autenticación iniciada por un servicio backend sin interacción del navegador
  • MFA Adaptativo / Evaluación de Riesgo — para autenticación escalonada dinámica basada en puntuación de riesgo

Todas las funciones avanzadas de OAuth deben habilitarse por aplicación en la Consola de Auris en Aplicaciones > [App] > OAuth Avanzado.

Autorización de Dispositivos (RFC 8628)

El Flujo de Autorización de Dispositivos permite que dispositivos que no pueden mostrar un navegador (CLIs, smart TVs, dispositivos IoT, quioscos) autentiquen usuarios. El dispositivo muestra un código de usuario corto y una URL de verificación; el usuario visita la URL en un dispositivo separado (teléfono, laptop) e ingresa el código para aprobar.

POST/api/oauth/device-authorize

Solicita un par de código de dispositivo y código de usuario. El dispositivo muestra el user_code y verification_uri al usuario, luego sondea el endpoint de token hasta que el usuario apruebe o el código expire.

Cuerpo de la solicitud

{ "client_id": "cli-app-client-id", "scope": "openid profile email" }
CampoRequeridoDescripción
client_idSíEl Client ID de la aplicación. La aplicación debe tener el Flujo de Dispositivos habilitado.
scopeNoLista de scopes solicitados separados por espacios.

Respuesta exitosa

{ "ok": true, "data": { "device_code": "GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS", "user_code": "WDJB-MJHT", "verification_uri": "https://api.altovar.net/hosted/device", "verification_uri_complete": "https://api.altovar.net/hosted/device?user_code=WDJB-MJHT", "expires_in": 1800, "interval": 5 } }
CampoDescripción
device_codeCódigo largo y opaco usado por el dispositivo para sondear el endpoint de token. Nunca se muestra al usuario. Se almacena como hash SHA-256 en el servidor.
user_codeCódigo corto y legible de 8 caracteres (formato: XXXX-XXXX) mostrado al usuario.
verification_uriLa URL que el usuario visita en un dispositivo separado para ingresar el código.
verification_uri_completeLa URL con el código pre-rellenado. Útil para códigos QR.
expires_inSegundos hasta que expire el código de dispositivo (por defecto: 30 minutos).
intervalSegundos mínimos entre solicitudes de sondeo.

Códigos de error

CódigoHTTPDescripción
DEVICE_FLOW_DISABLED400La Autorización de Dispositivos no está habilitada para esta aplicación
VALIDATION_ERROR400Falta client_id

Sondeo de Tokens

Después de mostrar el código de usuario, el dispositivo sondea el endpoint de token en el intervalo especificado:

Cuerpo de la solicitud

{ "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": "GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS", "client_id": "cli-app-client-id" }

Respuesta pendiente (el usuario aún no ha aprobado)

{ "ok": false, "error": { "code": "AUTHORIZATION_PENDING", "message": "The user has not yet approved the request. Continue polling." } }

Respuesta de ralentización (sondeo demasiado frecuente)

{ "ok": false, "error": { "code": "SLOW_DOWN", "message": "Polling too frequently. Increase interval by 5 seconds." } }

Respuesta exitosa (usuario aprobó)

{ "ok": true, "data": { "accessToken": "eyJhbGciOiJSUzI1NiJ9...", "refreshToken": "rt_...", "expiresIn": 900, "tokenType": "Bearer" } }

Códigos de error durante el sondeo

CódigoHTTPDescripción
AUTHORIZATION_PENDING400El usuario aún no ha aprobado — continuar sondeando
SLOW_DOWN400Sondeo demasiado rápido — aumentar el intervalo
EXPIRED_TOKEN400El código de dispositivo ha expirado. Iniciar un nuevo flujo.
ACCESS_DENIED400El usuario denegó la solicitud de autorización

La página de verificación pública en verification_uri muestra el formulario de login alojado con alcance previo a la aprobación del dispositivo. El usuario ingresa el código, se autentica (contraseña, SSO, magic link, etc.) y aprueba. El próximo sondeo del dispositivo devuelve los tokens.

Página de Verificación del Usuario

Auris proporciona una página de verificación alojada en /hosted/device donde el usuario:

  1. Ingresa el código de usuario de 8 caracteres (o llega a través de verification_uri_complete con el código pre-rellenado)
  2. Se autentica usando cualquier método configurado (contraseña, SSO, magic link, 2FA)
  3. Aprueba la solicitud de autorización del dispositivo
  4. Ve una pantalla de confirmación y puede cerrar la pestaña

Intercambio de Tokens (RFC 8693)

El Intercambio de Tokens permite a un servicio intercambiar un token por otro — ya sea para suplantar a un usuario (actuar como él) o para delegar el acceso (actuar en su nombre mientras se conserva el sujeto original). Esto es esencial en arquitecturas de microservicios donde un API gateway necesita llamar a servicios downstream con diferentes scopes de token.

POST/api/auth/tokenRequires: impersonate:users or delegate:tokens

Intercambia un token usando el tipo de concesión de Intercambio de Tokens. El llamante debe presentar un token de sujeto válido y especificar el tipo de intercambio.

Cuerpo de la solicitud — Suplantación

La suplantación reemplaza el sujeto por completo. El token resultante tiene al usuario objetivo como claim sub. Úsalo cuando un administrador necesita actuar como un usuario para depuración.

{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "subject_token": "eyJhbGciOiJSUzI1NiJ9...", "subject_token_type": "urn:ietf:params:oauth:token-type:access_token", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "exchange_type": "impersonation", "target_user_id": "usr_target123" }

Cuerpo de la solicitud — Delegación

La delegación conserva el sujeto original y añade un claim act (actor) al token resultante. El servicio downstream puede ver tanto para quién es el token como quién está actuando en su nombre.

{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "subject_token": "eyJhbGciOiJSUzI1NiJ9...", "subject_token_type": "urn:ietf:params:oauth:token-type:access_token", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "exchange_type": "delegation" }
CampoRequeridoDescripción
grant_typeSíDebe ser urn:ietf:params:oauth:grant-type:token-exchange
subject_tokenSíEl token de acceso existente a intercambiar
subject_token_typeSíDebe ser urn:ietf:params:oauth:token-type:access_token
requested_token_typeSíEl tipo de token de salida deseado. Típicamente urn:ietf:params:oauth:token-type:access_token
exchange_typeSíYa sea impersonation o delegation
target_user_idSí*Requerido para suplantación — el ID del usuario a suplantar
scopeNoScopes separados por espacios para el nuevo token. Debe ser un subconjunto del original.

Respuesta exitosa — Suplantación

{ "ok": true, "data": { "accessToken": "eyJhbGciOiJSUzI1NiJ9...", "issuedTokenType": "urn:ietf:params:oauth:token-type:access_token", "tokenType": "Bearer", "expiresIn": 900 } }

El payload JWT del token de suplantación tendrá "sub": "usr_target123" con la identidad original del usuario que suplanta registrada en los registros de auditoría.

Respuesta exitosa — Delegación

{ "ok": true, "data": { "accessToken": "eyJhbGciOiJSUzI1NiJ9...", "issuedTokenType": "urn:ietf:params:oauth:token-type:access_token", "tokenType": "Bearer", "expiresIn": 900 } }

El payload JWT del token delegado incluye un claim act:

{ "sub": "usr_original_user", "act": { "sub": "usr_acting_service" }, "scope": "read:users" }

Códigos de error

CódigoHTTPDescripción
TOKEN_EXCHANGE_DISABLED400El Intercambio de Tokens no está habilitado para esta aplicación
INVALID_SUBJECT_TOKEN400El token de sujeto es inválido o ha expirado
TARGET_USER_NOT_FOUND404El target_user_id no existe
PERMISSION_DENIED403El llamante carece del permiso impersonate:users o delegate:tokens
SCOPE_EXCEEDS_ORIGINAL400El scope solicitado no es un subconjunto del scope del token original

La suplantación es una operación con privilegios elevados. El permiso impersonate:users debe restringirse a roles de administrador y cuentas de servicio M2M que lo requieran. Todos los eventos de suplantación se registran en el registro de auditoría con el actor y el usuario suplantado.

DPoP — Tokens Vinculados al Remitente (RFC 9449)

La Demostración de Prueba de Posesión (DPoP) vincula tokens a un cliente específico al requerir una prueba criptográfica con cada solicitud. Aunque un token vinculado a DPoP sea robado, no puede usarse sin la clave privada correspondiente.

Cómo Funciona DPoP

  1. El cliente genera un par de claves (típicamente EC P-256 o RSA) y mantiene la clave privada segura.
  2. En cada solicitud, el cliente crea un JWT de prueba DPoP firmado que contiene el método HTTP, la URL y un jti único.
  3. El servidor valida la prueba, extrae la huella del JWK y vincula el token emitido a esa clave.
  4. Las llamadas posteriores a la API deben incluir tanto el token DPoP como una nueva prueba DPoP firmada con la misma clave.

Solicitar Tokens Vinculados a DPoP

Incluye un encabezado DPoP con cualquier solicitud de token (login, actualización, intercambio de código de autorización):

POST /api/auth/token HTTP/1.1 Content-Type: application/json DPoP: eyJhbGciOiJFUzI1NiIsInR5cCI6ImRwb3Arand0IiwiandrIjp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiLi4uIiwieSI6Ii4uLiJ9fQ.eyJodG0iOiJQT1NUIiwiaHR1IjoiaHR0cHM6Ly95b3VyLWF1cmlzLWRvbWFpbi5jb20vYXBpL2F1dGgvdG9rZW4iLCJpYXQiOjE3MDg1MjEyMDAsImp0aSI6InVuaXF1ZS1pZC0xMjMifQ.signature

Estructura del JWT de prueba DPoP

Encabezado:

{ "alg": "ES256", "typ": "dpop+jwt", "jwk": { "kty": "EC", "crv": "P-256", "x": "...", "y": "..." } }

Payload:

{ "htm": "POST", "htu": "https://api.altovar.net/api/auth/token", "iat": 1708521200, "jti": "unique-id-123", "nonce": "server-provided-nonce" }
CampoDescripción
htmEl método HTTP de la solicitud (POST, GET, etc.)
htuLa URI HTTP de la solicitud (sin parámetros de consulta)
iatMarca de tiempo de emisión. Debe estar dentro de una ventana corta (típicamente 60 segundos).
jtiUn identificador único para prevenir ataques de repetición
nonceNonce proporcionado por el servidor (incluido si el servidor devolvió un encabezado DPoP-Nonce)

Respuesta de token con DPoP

Cuando se incluye una prueba DPoP, el token de respuesta está vinculado a DPoP:

{ "ok": true, "data": { "accessToken": "eyJhbGciOiJSUzI1NiJ9...", "tokenType": "DPoP", "expiresIn": 900 } }

Nota que tokenType es "DPoP" en lugar de "Bearer". El JWT del token de acceso contiene un claim cnf (confirmación) con la huella del JWK:

{ "sub": "usr_abc123", "cnf": { "jkt": "JWK_THUMBPRINT_BASE64URL" } }

Gestión de Nonce

El servidor puede requerir un nonce para protección contra repetición. Cuando lo hace, la respuesta incluye:

DPoP-Nonce: eyJhbGciOiJIUzI1NiJ9...

Incluye este nonce en las pruebas DPoP posteriores. Si llega una solicitud sin el nonce requerido, el servidor devuelve 400 con un error use_dpop_nonce y un nonce nuevo en el encabezado.

Códigos de error

CódigoHTTPDescripción
INVALID_DPOP_PROOF400El JWT de prueba DPoP está malformado, expirado o tiene una firma inválida
DPOP_NONCE_REQUIRED400El servidor requiere un nonce — reintentar con el nonce del encabezado de respuesta DPoP-Nonce
DPOP_JKT_MISMATCH401La prueba DPoP fue firmada con una clave diferente a la que el token está vinculado
DPOP_DISABLED400DPoP no está habilitado para esta aplicación

CIBA — Autenticación Backchannel Iniciada por el Cliente

CIBA permite que un servicio backend inicie la autenticación de un usuario sin requerir que interactúe con una redirección del navegador. En su lugar, el usuario recibe una notificación (push, SMS o email) y aprueba la solicitud en su dispositivo.

Esto es útil para escenarios como la autenticación en centros de llamadas (“Le llamo de su banco, por favor apruebe el inicio de sesión en su teléfono”) o transacciones en puntos de venta.

POST/api/oauth/backchannel/authorizeRequires: manage:ciba_config

Inicia una solicitud de autenticación CIBA. El servidor envía una notificación al usuario identificado. El servicio llamante luego sondea (o recibe un callback) para obtener tokens una vez que el usuario apruebe.

Cuerpo de la solicitud

{ "client_id": "backend-service-id", "client_secret": "backend-service-secret", "scope": "openid profile", "login_hint": "[email protected]", "binding_message": "Aprobar inicio de sesión para Pedido #12345", "requested_expiry": 300 }
CampoRequeridoDescripción
client_idSíEl Client ID de la aplicación M2M
client_secretSíEl Client Secret de la aplicación M2M
scopeNoScopes solicitados
login_hintSíDirección de email o ID de usuario que identifica al usuario a autenticar
binding_messageNoMensaje legible por humanos mostrado al usuario en la notificación (máx 256 caracteres)
requested_expiryNoSegundos hasta que expire la solicitud (por defecto: 300, máx: 600)

Respuesta exitosa

{ "ok": true, "data": { "auth_req_id": "ciba_req_abc123def456", "expires_in": 300, "interval": 5 } }

Modos de Notificación

CIBA soporta tres modos de entrega de notificaciones, configurados por aplicación:

ModoDescripción
pollEl servicio sondea el endpoint de token usando auth_req_id. Modo por defecto.
pingAuris envía un callback HTTP al notification_endpoint registrado de la aplicación cuando el usuario responde. El servicio luego llama al endpoint de token.
pushAuris envía los tokens directamente al notification_endpoint en el payload del callback. No se necesita sondeo.

Sondeo de Tokens CIBA

Para el modo poll, el servicio sondea el endpoint de token:

{ "grant_type": "urn:openid:params:grant-type:ciba", "auth_req_id": "ciba_req_abc123def456", "client_id": "backend-service-id", "client_secret": "backend-service-secret" }

Las respuestas de sondeo siguen el mismo patrón que la Autorización de Dispositivos:

  • AUTHORIZATION_PENDING mientras se espera la aprobación del usuario
  • SLOW_DOWN si se sondea demasiado frecuentemente
  • EXPIRED_TOKEN si la solicitud expiró
  • ACCESS_DENIED si el usuario rechazó la solicitud
  • Respuesta completa de token al aprobarse

Códigos de error

CódigoHTTPDescripción
CIBA_DISABLED400CIBA no está habilitado para esta aplicación
USER_NOT_FOUND404El login_hint no coincide con ningún usuario
NOTIFICATION_FAILED500No se pudo entregar la notificación de autenticación al usuario
BINDING_MESSAGE_TOO_LONG400binding_message supera los 256 caracteres

Evaluación de Riesgo y MFA Adaptativo

Auris realiza una evaluación de riesgo automática en cada intento de autenticación. La puntuación de riesgo se calcula a partir de cinco factores ponderados y determina si se requieren pasos de autenticación adicionales (MFA escalonado).

Factores de Puntuación de Riesgo

FactorPesoDescripción
Reputación IP20%IPs maliciosas conocidas, VPNs, proxies, centros de datos
Confianza del Dispositivo20%Si la huella del dispositivo ha sido vista antes
Anomalía Geográfica20%Detección de viajes imposibles (login desde un lugar lejano demasiado rápido)
Comportamiento20%Patrones de login inusuales (hora del día, frecuencia)
Sensibilidad de la Acción20%Qué tan sensible es la acción solicitada

Niveles de riesgo: LOW (0-30), MEDIUM (31-60), HIGH (61-80), CRITICAL (81-100).

Cuando la puntuación de riesgo supera los umbrales configurados, Auris desafía automáticamente al usuario con MFA escalonado antes de emitir tokens. Los claims acr (Referencia de Clase de Contexto de Autenticación) y amr (Referencias de Métodos de Autenticación) en el JWT reflejan el nivel de autenticación real alcanzado.

GET/api/auth/risk/assessmentsRequires: view:risk_assessments

Lista las evaluaciones de riesgo recientes del tenant. Útil para monitorear patrones de login sospechosos y revisar las decisiones de puntuación de riesgo.

Parámetros de consulta

ParámetroTipoDescripción
pageintegerNúmero de página (por defecto: 1)
limitintegerElementos por página (por defecto: 20)
userIdstringFiltrar por ID de usuario
levelLOW | MEDIUM | HIGH | CRITICALFiltrar por nivel de riesgo
dateFromISO 8601Inicio del rango de fechas
dateToISO 8601Fin del rango de fechas

Respuesta exitosa

{ "ok": true, "data": { "data": [ { "id": "risk_abc123", "userId": "usr_def456", "score": 72, "level": "HIGH", "factors": { "ipReputation": { "score": 85, "isVpn": true, "isProxy": false }, "deviceTrust": { "score": 50, "isNewDevice": true }, "geoAnomaly": { "score": 90, "distance": 5200, "timeSinceLastLogin": 1800 }, "behavior": { "score": 60, "unusualTime": true }, "actionSensitivity": { "score": 75 } }, "actionTaken": "step_up_mfa", "ipAddress": "203.0.113.42", "country": "CN", "city": "Beijing", "createdAt": "2025-02-18T03:45:00Z" } ], "pagination": { "page": 1, "limit": 20, "total": 156, "totalPages": 8 } } }
GET/api/auth/risk/rulesRequires: manage:risk_rules

Lista todas las reglas de riesgo personalizadas configuradas para el tenant. Las reglas de riesgo permiten anular o ampliar la puntuación predeterminada para condiciones específicas.

Respuesta exitosa

{ "ok": true, "data": [ { "id": "rule_abc123", "name": "Bloquear rangos VPN conocidos", "condition": { "field": "ipReputation.isVpn", "operator": "equals", "value": true }, "action": "block", "scoreModifier": 40, "isActive": true, "createdAt": "2025-01-15T10:00:00Z" } ] }
POST/api/auth/risk/rulesRequires: manage:risk_rules

Crea una regla de riesgo personalizada. Las reglas se evalúan durante el login y pueden modificar la puntuación de riesgo, requerir autenticación adicional o bloquear el login por completo.

Cuerpo de la solicitud

{ "name": "Requerir MFA para nuevos países", "condition": { "field": "geoAnomaly.isNewCountry", "operator": "equals", "value": true }, "action": "step_up_mfa", "scoreModifier": 30, "isActive": true }
CampoRequeridoDescripción
nameSíNombre legible por humanos de la regla
conditionSíObjeto de condición con field, operator y value
actionSíUno de: allow, step_up_mfa, block, log
scoreModifierNoPuntos a añadir a la puntuación de riesgo cuando se cumple la condición (0-100)
isActiveNoSi la regla está activa (por defecto: true)

Campos de condición disponibles: ipReputation.isVpn, ipReputation.isProxy, ipReputation.isDatacenter, deviceTrust.isNewDevice, geoAnomaly.isNewCountry, geoAnomaly.distance, behavior.unusualTime, behavior.failedAttempts.

Operadores disponibles: equals, not_equals, greater_than, less_than, contains, in.

Respuesta exitosa

{ "ok": true, "data": { "id": "rule_def456", "name": "Requerir MFA para nuevos países", "condition": { "field": "geoAnomaly.isNewCountry", "operator": "equals", "value": true }, "action": "step_up_mfa", "scoreModifier": 30, "isActive": true, "createdAt": "2025-02-18T10:00:00Z" } }
PUT/api/auth/risk/rules/[id]Requires: manage:risk_rules

Actualiza el nombre, condición, acción, modificador de puntuación o estado activo de una regla de riesgo.

Cuerpo de la solicitud

{ "name": "Requerir MFA para nuevos países (actualizado)", "scoreModifier": 50, "isActive": true }
DELETE/api/auth/risk/rules/[id]Requires: manage:risk_rules

Elimina una regla de riesgo. Tiene efecto inmediato en el próximo intento de login.

Respuesta exitosa

{ "ok": true, "data": { "deleted": true } }

ACR y AMR en Tokens

Cuando el MFA adaptativo activa la autenticación escalonada, el JWT emitido incluye los claims acr y amr que los servicios downstream pueden usar para verificar la solidez de la autenticación:

{ "sub": "usr_abc123", "acr": "urn:auris:acr:mfa", "amr": ["pwd", "otp"], "iat": 1708521200, "exp": 1708522100 }
ClaimDescripción
acrReferencia de Clase de Contexto de Autenticación. Valores: urn:auris:acr:pwd (solo contraseña), urn:auris:acr:mfa (contraseña + segundo factor), urn:auris:acr:strong (contraseña + segundo factor fuerte como WebAuthn)
amrReferencias de Métodos de Autenticación. Array de métodos usados: pwd, otp (TOTP), sms, webauthn, social, magic_link, sso

Los servidores de recursos pueden requerir un nivel mínimo de acr para operaciones sensibles verificando los claims del JWT antes de procesar la solicitud.

Referencia de Permisos

PermisoDescripción
manage:device_codesGestionar la configuración del Flujo de Autorización de Dispositivos
impersonate:usersIntercambiar tokens para suplantación (actuar como otro usuario)
delegate:tokensIntercambiar tokens para delegación (actuar en nombre de otro usuario)
manage:dpop_configConfigurar los ajustes de DPoP para las aplicaciones
manage:ciba_configConfigurar los ajustes de CIBA y los endpoints de notificación
view:risk_assessmentsVer registros de evaluación de riesgo y detalles de puntuación
manage:risk_rulesCrear, actualizar y eliminar reglas de riesgo personalizadas
manage:advanced_oauthAcceso completo a toda la configuración avanzada de OAuth

Todas las funciones avanzadas de OAuth requieren habilitación explícita en cada aplicación. Los ajustes de la aplicación en la Consola de Auris incluyen interruptores para Flujo de Dispositivos, Intercambio de Tokens, DPoP y CIBA. Los indicadores enable* correspondientes en el modelo de Aplicación controlan la disponibilidad.


Relacionado