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.
/api/oauth/device-authorizeSolicita 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"
}| Campo | Requerido | Descripción |
|---|---|---|
client_id | Sí | El Client ID de la aplicación. La aplicación debe tener el Flujo de Dispositivos habilitado. |
scope | No | Lista 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
}
}| Campo | Descripción |
|---|---|
device_code | Có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_code | Código corto y legible de 8 caracteres (formato: XXXX-XXXX) mostrado al usuario. |
verification_uri | La URL que el usuario visita en un dispositivo separado para ingresar el código. |
verification_uri_complete | La URL con el código pre-rellenado. Útil para códigos QR. |
expires_in | Segundos hasta que expire el código de dispositivo (por defecto: 30 minutos). |
interval | Segundos mínimos entre solicitudes de sondeo. |
Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
DEVICE_FLOW_DISABLED | 400 | La Autorización de Dispositivos no está habilitada para esta aplicación |
VALIDATION_ERROR | 400 | Falta 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ódigo | HTTP | Descripción |
|---|---|---|
AUTHORIZATION_PENDING | 400 | El usuario aún no ha aprobado — continuar sondeando |
SLOW_DOWN | 400 | Sondeo demasiado rápido — aumentar el intervalo |
EXPIRED_TOKEN | 400 | El código de dispositivo ha expirado. Iniciar un nuevo flujo. |
ACCESS_DENIED | 400 | El 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:
- Ingresa el código de usuario de 8 caracteres (o llega a través de
verification_uri_completecon el código pre-rellenado) - Se autentica usando cualquier método configurado (contraseña, SSO, magic link, 2FA)
- Aprueba la solicitud de autorización del dispositivo
- 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.
/api/auth/tokenRequires: impersonate:users or delegate:tokensIntercambia 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"
}| Campo | Requerido | Descripción |
|---|---|---|
grant_type | Sí | Debe ser urn:ietf:params:oauth:grant-type:token-exchange |
subject_token | Sí | El token de acceso existente a intercambiar |
subject_token_type | Sí | Debe ser urn:ietf:params:oauth:token-type:access_token |
requested_token_type | Sí | El tipo de token de salida deseado. Típicamente urn:ietf:params:oauth:token-type:access_token |
exchange_type | Sí | Ya sea impersonation o delegation |
target_user_id | Sí* | Requerido para suplantación — el ID del usuario a suplantar |
scope | No | Scopes 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ódigo | HTTP | Descripción |
|---|---|---|
TOKEN_EXCHANGE_DISABLED | 400 | El Intercambio de Tokens no está habilitado para esta aplicación |
INVALID_SUBJECT_TOKEN | 400 | El token de sujeto es inválido o ha expirado |
TARGET_USER_NOT_FOUND | 404 | El target_user_id no existe |
PERMISSION_DENIED | 403 | El llamante carece del permiso impersonate:users o delegate:tokens |
SCOPE_EXCEEDS_ORIGINAL | 400 | El 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
- El cliente genera un par de claves (típicamente EC P-256 o RSA) y mantiene la clave privada segura.
- En cada solicitud, el cliente crea un JWT de prueba DPoP firmado que contiene el método HTTP, la URL y un
jtiúnico. - El servidor valida la prueba, extrae la huella del JWK y vincula el token emitido a esa clave.
- 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.signatureEstructura 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"
}| Campo | Descripción |
|---|---|
htm | El método HTTP de la solicitud (POST, GET, etc.) |
htu | La URI HTTP de la solicitud (sin parámetros de consulta) |
iat | Marca de tiempo de emisión. Debe estar dentro de una ventana corta (típicamente 60 segundos). |
jti | Un identificador único para prevenir ataques de repetición |
nonce | Nonce 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ódigo | HTTP | Descripción |
|---|---|---|
INVALID_DPOP_PROOF | 400 | El JWT de prueba DPoP está malformado, expirado o tiene una firma inválida |
DPOP_NONCE_REQUIRED | 400 | El servidor requiere un nonce — reintentar con el nonce del encabezado de respuesta DPoP-Nonce |
DPOP_JKT_MISMATCH | 401 | La prueba DPoP fue firmada con una clave diferente a la que el token está vinculado |
DPOP_DISABLED | 400 | DPoP 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.
/api/oauth/backchannel/authorizeRequires: manage:ciba_configInicia 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
}| Campo | Requerido | Descripción |
|---|---|---|
client_id | Sí | El Client ID de la aplicación M2M |
client_secret | Sí | El Client Secret de la aplicación M2M |
scope | No | Scopes solicitados |
login_hint | Sí | Dirección de email o ID de usuario que identifica al usuario a autenticar |
binding_message | No | Mensaje legible por humanos mostrado al usuario en la notificación (máx 256 caracteres) |
requested_expiry | No | Segundos 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:
| Modo | Descripción |
|---|---|
poll | El servicio sondea el endpoint de token usando auth_req_id. Modo por defecto. |
ping | Auris 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. |
push | Auris 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_PENDINGmientras se espera la aprobación del usuarioSLOW_DOWNsi se sondea demasiado frecuentementeEXPIRED_TOKENsi la solicitud expiróACCESS_DENIEDsi el usuario rechazó la solicitud- Respuesta completa de token al aprobarse
Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
CIBA_DISABLED | 400 | CIBA no está habilitado para esta aplicación |
USER_NOT_FOUND | 404 | El login_hint no coincide con ningún usuario |
NOTIFICATION_FAILED | 500 | No se pudo entregar la notificación de autenticación al usuario |
BINDING_MESSAGE_TOO_LONG | 400 | binding_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
| Factor | Peso | Descripción |
|---|---|---|
| Reputación IP | 20% | IPs maliciosas conocidas, VPNs, proxies, centros de datos |
| Confianza del Dispositivo | 20% | Si la huella del dispositivo ha sido vista antes |
| Anomalía Geográfica | 20% | Detección de viajes imposibles (login desde un lugar lejano demasiado rápido) |
| Comportamiento | 20% | Patrones de login inusuales (hora del día, frecuencia) |
| Sensibilidad de la Acción | 20% | 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.
/api/auth/risk/assessmentsRequires: view:risk_assessmentsLista 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ámetro | Tipo | Descripción |
|---|---|---|
page | integer | Número de página (por defecto: 1) |
limit | integer | Elementos por página (por defecto: 20) |
userId | string | Filtrar por ID de usuario |
level | LOW | MEDIUM | HIGH | CRITICAL | Filtrar por nivel de riesgo |
dateFrom | ISO 8601 | Inicio del rango de fechas |
dateTo | ISO 8601 | Fin 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 }
}
}/api/auth/risk/rulesRequires: manage:risk_rulesLista 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"
}
]
}/api/auth/risk/rulesRequires: manage:risk_rulesCrea 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
}| Campo | Requerido | Descripción |
|---|---|---|
name | Sí | Nombre legible por humanos de la regla |
condition | Sí | Objeto de condición con field, operator y value |
action | Sí | Uno de: allow, step_up_mfa, block, log |
scoreModifier | No | Puntos a añadir a la puntuación de riesgo cuando se cumple la condición (0-100) |
isActive | No | Si 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"
}
}/api/auth/risk/rules/[id]Requires: manage:risk_rulesActualiza 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
}/api/auth/risk/rules/[id]Requires: manage:risk_rulesElimina 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
}| Claim | Descripción |
|---|---|
acr | Referencia 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) |
amr | Referencias 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
| Permiso | Descripción |
|---|---|
manage:device_codes | Gestionar la configuración del Flujo de Autorización de Dispositivos |
impersonate:users | Intercambiar tokens para suplantación (actuar como otro usuario) |
delegate:tokens | Intercambiar tokens para delegación (actuar en nombre de otro usuario) |
manage:dpop_config | Configurar los ajustes de DPoP para las aplicaciones |
manage:ciba_config | Configurar los ajustes de CIBA y los endpoints de notificación |
view:risk_assessments | Ver registros de evaluación de riesgo y detalles de puntuación |
manage:risk_rules | Crear, actualizar y eliminar reglas de riesgo personalizadas |
manage:advanced_oauth | Acceso 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
- DPoP (Prueba de Posesión) — Cómo funciona la validación de prueba DPoP
- Flujo de Autorización de Dispositivos — Detalles del protocolo de flujo de dispositivos
- CIBA (Autenticación Backchannel) — Arquitectura del protocolo CIBA
- Intercambio de Tokens (RFC 8693) — Detalles del protocolo de intercambio de tokens
- Implementar DPoP — Integración DPoP paso a paso
- Flujo de Autorización de Dispositivos — Guía de integración del flujo de dispositivos
- Guía CIBA — Tutorial de integración CIBA
- Intercambio de Tokens — Guía de suplantación y delegación
- OAuth2 Avanzado — Configurar funciones avanzadas de OAuth2 desde la Consola