Delegação serviço para serviço
Em algumas arquiteturas de API, um serviço backend recebe uma solicitação de um usuário autenticado e precisa chamar outro serviço backend preservando a identidade do usuário.
Por exemplo:
Usuário -> API A -> API B
A API B precisa saber duas coisas:
- O chamador é um serviço confiável, como a API A.
- A operação está sendo realizada para o usuário original.
Use a concessão de troca de token do Logto para trocar o token de acesso do usuário por um novo token de acesso cujo público é o recurso de API downstream. Isso segue o padrão de troca de token do OAuth 2.0 e evita encaminhar o token original do usuário para serviços downstream.
Quando usar este fluxo
Use a delegação serviço para serviço quando:
- A API A é um serviço backend que pode autenticar-se com segurança no endpoint de token do Logto.
- A API A recebe um token de acesso de usuário emitido pelo Logto.
- A API A precisa chamar a API B em nome do mesmo usuário.
- A API B deve validar um token de acesso com seu próprio recurso de API como público.
Não use este fluxo para acesso puramente máquina para máquina sem um usuário. Nesse caso, use o fluxo de credenciais do cliente. Para cenários de suporte, administração ou agente, onde um usuário atua temporariamente como outro usuário, use imitação de usuário.
Como funciona
O token de acesso trocado representa o usuário original (sub) e está vinculado ao recurso de API downstream (aud). A API downstream também pode inspecionar a reivindicação client_id para identificar o aplicativo que iniciou a troca.
Pré-requisitos
- Crie recursos de API para os serviços envolvidos. Veja Proteger recursos globais de API.
- Configure as permissões da API B e atribua-as aos usuários por meio de papéis ou papéis de organização.
- Use um aplicativo do lado do servidor para a API A, como um app máquina para máquina ou um app web tradicional, para que ele possa autenticar-se com segurança usando um segredo de aplicativo.
- Habilite a troca de token para o aplicativo da API A.
Antes de usar a concessão de troca de token, você precisa habilitá-la para seu aplicativo:
- Vá para Console > Aplicativos e selecione seu aplicativo.
- Nas configurações do aplicativo, encontre a seção "Troca de token".
- Ative a opção "Permitir troca de token".
A troca de token está desabilitada por padrão por motivos de segurança. Se você não habilitá-la, receberá um erro "token exchange is not allowed for this application".
Solicitar um token de acesso para a API downstream
Quando a API A precisar chamar a API B, faça uma solicitação de troca de token para o endpoint de token do Logto.
Para aplicativos web tradicionais ou aplicativos máquina para máquina com um segredo de aplicativo, inclua as credenciais no cabeçalho Authorization:
POST /oidc/token HTTP/1.1
Host: tenant.logto.app
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(api-a-app-id:api-a-app-secret)>
grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&subject_token=<user_access_token_received_by_api_a>
&subject_token_type=urn:ietf:params:oauth:token-type:access_token
&resource=https://api-b.example.com
&scope=read:orders
Parâmetros:
grant_type: Useurn:ietf:params:oauth:grant-type:token-exchange.subject_token: O token de acesso de usuário original emitido pelo Logto recebido pela API A.subject_token_type: Useurn:ietf:params:oauth:token-type:access_token.resource: O indicador de recurso da API B.scope: As permissões downstream que a API A está solicitando para esta chamada delegada. O Logto emite apenas os escopos solicitados que estão disponíveis para o usuário original para este recurso de acordo com as configurações de RBAC.
O Logto retorna um token de acesso para a API B:
{
"access_token": "eyJhbGci...<truncated>",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "read:orders"
}
Quando decodificado, o token de acesso inclui reivindicações semelhantes a:
{
"sub": "user_id",
"client_id": "api_a_app_id",
"iss": "https://tenant.logto.app/oidc",
"aud": "https://api-b.example.com",
"scope": "read:orders",
"exp": 1760000000
}
Em seguida, a API A chama a API B com o token trocado:
GET /orders HTTP/1.1
Host: api-b.example.com
Authorization: Bearer <exchanged_access_token>
Validar o token na API B
A API B deve validar o token trocado como qualquer token de acesso de recurso de API emitido pelo Logto:
- Verifique a assinatura usando os JWKs do Logto.
- Verifique o emissor (
iss). - Verifique se o público (
aud) corresponde ao indicador de recurso da API B. - Verifique a expiração (
exp). - Verifique os escopos necessários.
- Use
subcomo o ID do usuário original. - Opcionalmente, verifique
client_idse apenas serviços upstream específicos puderem realizar chamadas delegadas.
Veja Validar tokens de acesso na API para orientações de implementação.