Compreendendo a troca de token em OAuth/OIDC
A troca de tokens é uma extensão do OAuth que permite que clientes confiáveis obtenham novos tokens sem interação do usuário, útil para personificação, automação, integração entre sistemas e migração de tokens em diversos cenários.
Introduzido no RFC 8693, a troca de tokens é uma extensão do OAuth que permite que clientes confiáveis troquem um token existente por um novo com diferentes atributos ou escopos. Este mecanismo é particularmente útil para um serviço, uma aplicação ou um usuário final obter um token de acesso OAuth normal via um token pré-autorizado, sem a necessidade de passar por todo o fluxo OAuth.
Comparação com o fluxo do código de autorização
Primeiro, vamos dar uma olhada no fluxo de Código de Autorização OAuth, que é o fluxo mais comum para obter um token de acesso.
E este é o fluxo de troca de tokens:
Redirecionamento
A principal diferença é que no fluxo de código de autorização, a aplicação cliente redireciona o usuário para o servidor de autorização para obter um token de acesso. Na troca de tokens, a aplicação cliente pode trocar um token com o servidor de autorização sem envolver o usuário no redirecionamento.
Isso ocorre porque no fluxo de código de autorização, a aplicação cliente não é "confiável" e precisa conhecer as credenciais do usuário para obter um token de acesso. Na troca de tokens, a aplicação cliente é confiável por já ter obtido o token do usuário, e o servidor de autorização irá validar o token e emitir um novo.
Emissor de token e serviço de troca de token
No fluxo de troca de tokens, o "Auth Server" agora são dois participantes:
- Emissor de token: emite o token de assunto para a aplicação cliente.
- Serviço de troca de token: valida o token de assunto e emite um novo token para a aplicação cliente.
O serviço de troca de token é o mesmo que o "Auth Server" no fluxo de código de autorização, e o emissor de token pode ser um provedor de identidade de terceiros, ou dividido do "Auth Server" como um serviço dedicado.
Quando usar a troca de tokens?
O fluxo de troca de tokens pode ser realizado sem interação do usuário, isso é útil nos seguintes cenários:
- Personificação: Permitir que serviços (por exemplo, microsserviços de backend) ou usuários admin realizem ações em nome de um usuário sem expor todas as credenciais do usuário.
- Automação: Permitir que serviços confiáveis realizem ações automaticamente sem intervenção manual, ou realizem testes automatizados.
- Integração com Outros IdPs: Traduzir tokens entre diferentes sistemas de identidade para manter uma experiência de usuário contínua e gerenciar permissões de forma eficaz. Um cenário comum é traduzir um token SSO para um token para um serviço downstream.
- Migração: Migrar tokens de um servidor de autorização para outro, por exemplo, de um sistema legado para um sistema compatível com OAuth/OIDC moderno.
Processo de troca de token
Trocar por um novo token de acesso é o caso de uso mais comum, tomaremos isso como um exemplo. Não se limitando ao token de acesso, a troca de tokens também pode ser usada para emitir outros tipos de tokens, como token de atualização, token de ID, etc.
Aplicação cliente
Para realizar a troca de tokens, é necessária uma aplicação cliente registrada junto ao servidor de autorização.
E a aplicação cliente deve ter um subject_token
antes de iniciar o fluxo de troca de tokens, este token é geralmente concedido pelo servidor de autorização ou pelo provedor de identidade de terceiros confiável. Ao possuir este token, a aplicação cliente agora pode ser "confiável" para trocar tokens sem a necessidade das credenciais e interação do usuário.
Solicitação de troca de token
O cliente envia uma solicitação para o endpoint de token do servidor de autorização para trocar um token existente. Isto inclui o subject_token
(o token a ser trocado) e, opcionalmente, o público-alvo desejado, escopo e tipo de token.
grant_type
: OBRIGATÓRIO. O valor deste parâmetro deve serurn:ietf:params:oauth:grant-type:token-exchange
, indicando que uma troca de token está sendo realizada.subject_token
: OBRIGATÓRIO. O PAT do usuário.subject_token_type
: OBRIGATÓRIO. O tipo de token de segurança fornecido no parâmetrosubject_token
. Um valor comum deste parâmetro éurn:ietf:params:oauth:token-type:access_token
, mas pode variar com base no token que está sendo trocado.resource
: OPCIONAL. O indicador de recurso, ajuda a especificar o recurso alvo para o token de acesso.audience
: OPCIONAL. O público do token de acesso, indicando os destinatários pretendidos do token, o servidor de autorização pode usar o valor deresource
seaudience
não for especificado.scope
: OPCIONAL. Os escopos solicitados.
Além disso, a solicitação precisa incluir as informações do cliente, que podem ser codificadas como um cabeçalho de autenticação básica ou enviadas como dados de formulário.
Aqui está um exemplo de solicitação:
Troca de token no Logto
O Logto suporta a troca de tokens de forma nativa, incluindo personificação e tokens de acesso pessoal.