- una clave API de cuenta distinta
- un ID de usuario final delegado opcional vía
X-On-Behalf-Of - la propiedad y uso de recursos aguas abajo registrados contra ese contexto autenticado
Verificar el aislamiento de inquilinos en la práctica
Trata cada inquilino como una cuenta separada con su propia clave API. El objetivo es mostrar cuatro cosas:- El Inquilino A y el Inquilino B usan claves API diferentes.
- El Inquilino A y el Inquilino B pueden tener configuraciones de cuota diferentes.
- El Inquilino A y el Inquilino B pueden tener políticas diferentes.
- Un recurso creado bajo el Inquilino A no es accesible bajo el Inquilino B.
Paso 1: definir dos inquilinos
Comienza con dos claves API separadas.- El Inquilino A y el Inquilino B no comparten una clave.
- El Inquilino A y el Inquilino B no comparten la misma configuración de cuota.
Paso 2: configurar políticas diferentes para cada inquilino
Ahora asigna a los dos inquilinos políticas de guardrails diferentes. Configura el Inquilino A para bloquear la palabraconfidential.
- El Inquilino A falla porque
confidentialestá bloqueado en la política del Inquilino A. - El Inquilino B no hereda la política del Inquilino A.
Paso 3: demostrar cuotas separadas
Después de crear dos claves con diferentes límites, envía el mismo tipo de solicitud a través de ambas claves. El Inquilino A usa la clave de bajo límite:- El Inquilino A comienza a recibir
429antes. - El Inquilino B sigue teniendo éxito porque tiene una clave y una cuota diferente.
Paso 4: demostrar aislamiento de recursos
Crea un recurso bajo el Inquilino A. Una conversación es un ejemplo sencillo porque es visible a través de la API pública.conv_tenant_a_123.
El Inquilino A puede leerlo:
- se usa la misma superficie de API
- se usa la misma plataforma
- pero la identidad, política, cuota y propiedad de recursos se aplican por separado
Paso opcional 5: mostrar libros de uso separados
Si quieres una prueba visible adicional, consulta el uso por separado para cada inquilino.Qué demuestra esta guía paso a paso
Si ejecutas la guía anterior, puedes hacer estas afirmaciones exactas:- Claves independientes: El Inquilino A y el Inquilino B se autentican con diferentes claves API.
- Cuotas independientes: El Inquilino A y el Inquilino B pueden tener configuraciones de límite de tasa diferentes y recibir comportamientos
429distintos. - Políticas independientes: El Inquilino A y el Inquilino B pueden establecer diferentes guardrails y obtener resultados distintos sobre el mismo contenido.
- Aislamiento real: Un recurso creado bajo el Inquilino A no es legible bajo el Inquilino B.
Cómo funciona el modelo de identidad internamente
La autenticación en la API de MKA1 tiene tres capas:- Tu clave API identifica tu cuenta.
X-On-Behalf-Ofidentifica al usuario final para el que actúa tu servidor.- Un JWT intercambiado otorga a un servicio aguas abajo una credencial de corta duración derivada de esa clave API y del contexto de usuario final.
- Envía
Authorization: Bearer <mka1-api-key>en cada solicitud del lado del servidor. - Añade
X-On-Behalf-Ofcuando la solicitud pertenezca a uno de tus usuarios finales. - Usa
POST /api/v1/authentication/api-key/exchange-tokencuando otro servicio deba recibir un token de corta duración en vez de tu clave API real.
El camino de la solicitud
La API de MKA1 no pide a los servicios aguas abajo que validen los tokens bearer por sí mismos. Las solicitudes pasan primero por el gateway, y el gateway inyecta cabeceras de identidad confiables para el resto de la plataforma. Cuando también envíasX-On-Behalf-Of, el gateway mantiene esa identidad de usuario final delegada con la solicitud:
El intercambio JWT añade un paso extra:
Los tres patrones principales
Patrón 1: solicitudes solo backend
Usa esto cuando tu backend llama a la API de MKA1 para su propio flujo de trabajo y no hay un usuario final separado que rastrear.Patrón 2: integración de servidor multiusuario
Usa esto cuando tu backend realiza la solicitud para uno de los usuarios de tu propia aplicación.Patrón 3: intercambia tu clave API por un JWT de corta duración
Usa esto cuando otro servicio deba recibir un token de tiempo limitado en vez de tu clave API de larga duración.Qué cabeceras envías vs cuáles inyecta la plataforma
Cabeceras que envías
Cabeceras confiables inyectadas dentro de la plataforma
Los clientes envían
Authorization y a veces X-On-Behalf-Of.
Los clientes no envían directamente las cabeceras internas X-User-ID o X-Api-Key-ID.
Estas son derivadas por el gateway tras la validación.Cómo funciona el intercambio JWT
POST /api/v1/authentication/api-key/exchange-token convierte una clave API de larga duración en un token de corta duración para otro servicio.
El cuerpo de la solicitud tiene cuatro campos significativos:
audience: la URL exacta del servicio que debe aceptar el JWTexternalUserId: el ID de usuario final colocado en el subject del JWTexpiresIn: tiempo de vida del token en segundos, de300a2592000permissions: un subconjunto opcional de los permisos de la clave API
ak: el ID de la clave API usada para lookup y aplicación de límites de tasasub: tu identidad de usuario final delegadaaud: el servicio que debe aceptar el tokenpermissions: el conjunto de capacidades permitidas para ese token
Cómo funciona el alcance de inquilino en la práctica
La decisión de diseño más importante es que la identidad de usuario final es explícita. Si envíasX-On-Behalf-Of: user_123, los servicios aguas abajo pueden mantener recursos y uso asociados a ese usuario.
Esto es importante para:
- conversaciones guardadas
- respuestas almacenadas
- archivos y almacenes vectoriales
- uso y auditoría por usuario
- comprobaciones de autorización delegadas
X-On-Behalf-Of, las solicitudes se ejecutan como trabajo de cuenta solo backend.
Cuando lo incluyes, la solicitud se convierte en una solicitud delegada para un usuario final específico.
Usa un identificador estable de tu propio sistema.
No uses un nombre visible mutable a menos que ya sea tu ID de usuario canónico.
Límites de tasa y qué deben esperar los llamadores
Las claves API pueden tener configuraciones de límite de tasa personalizadas. La ruta de autenticación aplica los límites de tasa por clave API antes de que la solicitud llegue a los servicios aguas abajo. En la práctica, esto significa:- dos claves API diferentes pueden tener límites diferentes
- una clave API sobrecargada no implica que otra clave esté agotada
- un
429es parte de la ruta de autenticación, no un error de modelo aguas abajo
Errores comunes
Enviar X-On-Behalf-Of desde código en el navegador
No expongas tu clave API en código de cliente de navegador o móvil.
Tu servidor debe llamar a la API de MKA1 y adjuntar X-On-Behalf-Of allí.
Usar un identificador de usuario final inestable
Usa un ID interno duradero comouser_123.
No alternes entre correos electrónicos, nombres de usuario y nombres visibles para el mismo usuario.
Usar el audience incorrecto en JWTs intercambiados
El servicio aguas abajo debe validar el token para la audiencia prevista.
Establece audience en la URL real del servicio que debe aceptar el JWT.
Solicitar permisos más amplios que los de la clave API
El endpoint de intercambio de token solo permite un subconjunto de los permisos de la clave API. Si solicitas un permiso que la clave API no tiene, el intercambio falla.Tratar cabeceras internas propagadas como cabeceras públicas de cliente
Cabeceras comoX-User-ID y X-Api-Key-ID son parte de la ruta de solicitud interna confiable.
No son un sustituto de Authorization.
Apéndice de rutas de código
Los siguientes fragmentos muestran la forma principal de implementación detrás del comportamiento público.Kong valida el token bearer e inyecta cabeceras confiables
X-User-ID, X-Api-Key-ID y X-Exchange-JWT-External-User-ID después de la validación del gateway.