- uma chave de API de conta distinta
- um ID de usuário final delegado opcional via
X-On-Behalf-Of - propriedade e uso de recursos downstream registrados contra esse contexto autenticado
Verifique o isolamento de locatários na prática
Trate cada locatário como uma conta separada com sua própria chave de API. O objetivo é mostrar quatro coisas:- Locatário A e Locatário B usam chaves de API diferentes.
- Locatário A e Locatário B podem ter configurações de cota diferentes.
- Locatário A e Locatário B podem ter políticas diferentes.
- Um recurso criado sob o Locatário A não é acessível sob o Locatário B.
Passo 1: defina dois locatários
Comece com duas chaves de API separadas.- Locatário A e Locatário B não compartilham uma chave.
- Locatário A e Locatário B não compartilham a mesma configuração de cota.
Passo 2: configure políticas diferentes para cada locatário
Agora atribua políticas de guardrail diferentes para os dois locatários. Configure o Locatário A para bloquear a palavraconfidential.
- O Locatário A falha porque
confidentialestá bloqueada na política do Locatário A. - O Locatário B não herda a política do Locatário A.
Passo 3: demonstre cotas separadas
Após criar duas chaves com limites diferentes, envie o mesmo tipo de requisição por ambas as chaves. O Locatário A usa a chave de limite baixo:- O Locatário A começa a receber
429mais cedo. - O Locatário B continua tendo sucesso porque tem uma chave e uma cota diferente.
Passo 4: demonstre isolamento de recursos
Crie um recurso sob o Locatário A. Uma conversa é um exemplo fácil porque é visível pela API pública.conv_tenant_a_123.
O Locatário A pode ler:
- a mesma superfície de API é usada
- a mesma plataforma é usada
- mas identidade, política, cota e propriedade de recursos são aplicadas separadamente
Passo Opcional 5: mostre livros de uso separados
Se quiser mais um ponto de prova visível, consulte o uso separadamente por locatário.O que este passo a passo comprova
Se você executar o passo a passo acima, pode fazer estas afirmações exatas:- Chaves independentes: Locatário A e Locatário B autenticam com chaves de API diferentes.
- Cotas independentes: Locatário A e Locatário B podem ter configurações de rate-limit diferentes e receber comportamentos
429distintos. - Políticas independentes: Locatário A e Locatário B podem definir guardrails diferentes e obter resultados diferentes sobre o mesmo conteúdo.
- Isolamento real: Um recurso criado sob o Locatário A não é legível sob o Locatário B.
Como funciona o modelo de identidade por baixo
A autenticação na API MKA1 tem três camadas:- Sua chave de API identifica sua conta.
X-On-Behalf-Ofidentifica o usuário final para quem seu servidor está agindo.- Um JWT trocado fornece a um serviço downstream uma credencial de curta duração derivada daquela chave de API e do contexto de usuário final.
- Envie
Authorization: Bearer <mka1-api-key>em toda requisição do lado do servidor. - Adicione
X-On-Behalf-Ofquando a requisição pertencer a um de seus usuários finais. - Use
POST /api/v1/authentication/api-key/exchange-tokenquando outro serviço deve receber um token de curta duração em vez da sua chave de API.
O caminho da requisição
A API MKA1 não pede que serviços downstream validem tokens bearer por conta própria. As requisições passam primeiro pelo gateway, e o gateway injeta cabeçalhos de identidade confiáveis para o restante da plataforma. Quando você também enviaX-On-Behalf-Of, o gateway mantém essa identidade de usuário final delegada com a requisição:
A troca de JWT adiciona um passo extra:
Os três padrões principais
Padrão 1: requisições apenas backend
Use este quando seu backend estiver chamando a API MKA1 para seu próprio fluxo de trabalho e não houver usuário final separado para rastrear.Padrão 2: integração servidor multiusuário
Use este quando seu backend estiver fazendo a requisição para um dos usuários da sua aplicação.Padrão 3: troque sua chave de API por um JWT de curta duração
Use este quando outro serviço deve receber um token com tempo limitado em vez da sua chave de API de longa duração.Quais cabeçalhos você envia vs quais a plataforma injeta
Cabeçalhos que você envia
| Cabeçalho | Obrigatório | Significado |
|---|---|---|
Authorization | Sim | Sua chave de API MKA1 ou JWT trocado no formato bearer |
X-On-Behalf-Of | Não | Seu identificador estável de usuário final para requisições delegadas do lado do servidor |
Cabeçalhos confiáveis injetados dentro da plataforma
| Cabeçalho | Produzido por | Significado |
|---|---|---|
X-User-ID | Gateway | O ID do usuário autenticado da conta |
X-Api-Key-ID | Gateway | O ID da chave de API resolvida |
X-User-Role | Gateway | O contexto de função autenticado |
X-Api-Key-Permissions | Gateway | Permissões anexadas à chave de API |
X-Exchange-JWT-External-User-ID | Gateway | O ID do usuário final delegado |
X-Exchange-JWT-Permissions | Gateway | Permissões embutidas no JWT trocado |
Clientes enviam
Authorization e às vezes X-On-Behalf-Of.
Clientes não enviam diretamente os cabeçalhos internos X-User-ID ou X-Api-Key-ID.
Eles são derivados pelo gateway após validação.Como funciona a troca de JWT
POST /api/v1/authentication/api-key/exchange-token transforma uma chave de API de longa duração em um token de curta duração para outro serviço.
O corpo da requisição tem quatro campos significativos:
audience: a URL exata do serviço que deve aceitar o JWTexternalUserId: o ID do usuário final colocado no subject do JWTexpiresIn: tempo de vida do token em segundos, de300a2592000permissions: um subconjunto opcional das permissões da chave de API
ak: o ID da chave de API usado para lookup e aplicação de rate-limitsub: sua identidade de usuário final delegadaaud: o serviço que deve aceitar o tokenpermissions: o conjunto de capacidades permitidas para aquele token
Como o escopo de locatário funciona na prática
A escolha de design mais importante é que a identidade do usuário final é explícita. Se você enviarX-On-Behalf-Of: user_123, os serviços downstream podem manter recursos e uso associados a esse usuário.
Isso é importante para:
- conversas salvas
- respostas armazenadas
- arquivos e vetores
- uso e trilhas de auditoria por usuário
- verificações de autorização delegada
X-On-Behalf-Of, as requisições rodam como trabalho de conta apenas backend.
Quando você inclui, a requisição se torna delegada para um usuário final específico.
Use um identificador estável do seu próprio sistema.
Não use um nome de exibição mutável, a menos que esse já seja seu ID canônico de usuário.
Limites de taxa e o que os chamadores devem esperar
Chaves de API podem carregar configurações de rate-limit personalizadas. O caminho de autenticação aplica limites de taxa por chave de API antes da requisição chegar aos serviços downstream. Na prática, isso significa:- duas chaves de API diferentes podem ter limites diferentes
- uma chave de API sobrecarregada não implica que outra chave está esgotada
- um
429faz parte do caminho de autenticação, não é um erro do modelo downstream
Erros comuns
Enviar X-On-Behalf-Of a partir de código de navegador
Não exponha sua chave de API em código de navegador ou cliente mobile.
Seu servidor deve chamar a API MKA1 e anexar X-On-Behalf-Of lá.
Usar um identificador de usuário final instável
Use um ID interno durável comouser_123.
Não alterne entre emails, nomes de usuário e nomes de exibição para o mesmo usuário.
Usar o audience errado em JWTs trocados
O serviço downstream deve validar o token para o público pretendido.
Defina audience para a URL real do serviço que deve aceitar o JWT.
Solicitar permissões mais amplas que a chave de API
O endpoint de troca de token só permite um subconjunto das permissões da chave de API. Se você solicitar uma permissão que a chave não possui, a troca falha.Tratar cabeçalhos internos propagados como cabeçalhos públicos de cliente
Cabeçalhos comoX-User-ID e X-Api-Key-ID fazem parte do caminho interno confiável da requisição.
Eles não substituem o Authorization.
Apêndice de caminhos de código
Os trechos a seguir mostram a forma principal da implementação por trás do comportamento público.Kong valida o token bearer e injeta cabeçalhos confiáveis
X-User-ID, X-Api-Key-ID e X-Exchange-JWT-External-User-ID após a validação do gateway.