Gerencie o consentimento OAuth de usuários finais para agentes de IA com o Amazon Bedrock AgentCore

O problema: infraestrutura de consentimento OAuth que cada equipe precisava construir do zero

Agentes de IA frequentemente precisam acessar serviços externos — como GitHub e Slack — em nome de um usuário real. Para isso, o usuário precisa se autenticar com o provedor e aprovar explicitamente os acessos solicitados. O sistema, por sua vez, precisa associar com segurança essa autorização ao usuário que a concedeu. Esse processo é chamado de vinculação de sessão (session binding).

Até recentemente, quem usava o fluxo OAuth de três pernas (3LO) — também conhecido como fluxo de código de autorização do OAuth 2.0 — dentro do AgentCore Identity precisava construir e hospedar toda essa infraestrutura por conta própria. Isso incluía exibir a URL de autorização, hospedar um callback HTTPS público, autenticar o usuário de retorno, gerenciar sessões de navegador e chamar o endpoint CompleteResourceTokenAuth para concluir o fluxo.

A AWS anunciou uma solução gerenciada para esse problema: o Consent Portal, uma experiência web integrada ao AgentCore Identity, que elimina a necessidade de construir essa infraestrutura manualmente.

O que é o Consent Portal e como ele funciona

O Consent Portal é uma interface web gerenciada e um endpoint de vinculação de sessão para o AgentCore Gateway. O administrador cria um portal associado a um gateway e compartilha a URL com os usuários. A partir daí, o fluxo é completamente gerenciado:

  • O usuário se autentica com o Provedor de Identidade (IdP) da organização.
  • O portal lista os serviços disponíveis para o agente e seus respectivos status de conexão.
  • O usuário concede consentimento individualmente para cada provedor (por exemplo, GitHub ou Slack).
  • O portal gerencia os redirecionamentos do navegador e a vinculação de sessão.
  • O AgentCore Identity armazena os tokens resultantes em seu cofre de tokens.

Essa funcionalidade é especialmente útil para agentes acessados via Ambiente de Desenvolvimento Integrado (IDE) e clientes do Protocolo de Contexto de Modelo (MCP), como Kiro, Claude Code, Cursor e Visual Studio Code. O usuário concede o consentimento antes de invocar uma ferramenta, e as chamadas subsequentes já usam o token armazenado para aquele usuário.

Cenário de exemplo: assistente de desenvolvimento com acesso ao GitHub e Slack

Para ilustrar o funcionamento, a AWS usa o exemplo de uma empresa fictícia chamada Example Corp, que fornece aos seus desenvolvedores um assistente de codificação com IA via AgentCore Gateway. O assistente possui dois alvos configurados:

  • Um alvo GitHub, capaz de listar repositórios e criar issues.
  • Um alvo Slack, capaz de listar canais públicos e postar mensagens.

A empresa usa seu IdP corporativo para autenticar funcionários. O objetivo é que cada autorização OAuth do GitHub e do Slack fique vinculada ao funcionário que a aprovou, e que os desenvolvedores possam conectar cada provedor de forma independente, sem precisar repetir o processo toda vez que voltam à IDE.

Pré-requisitos

Antes de iniciar a configuração, são necessários:

Configuração pelo administrador (Passos 1 a 6)

Passo 1: Preparar o IdP corporativo e as conexões do gateway

O administrador precisa anexar uma política do Gerenciamento de Identidade e Acesso (IAM) à sua identidade para executar os passos iniciais. A política cobre ações como criar o Consent Portal, gerenciar provedores de credenciais OAuth2, listar e atualizar alvos do gateway, e criar e repassar a role de execução. O trecho abaixo mostra a política exata documentada pela AWS:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ManageConsentPortalResources",
      "Effect": "Allow",
      "Action": [
        "bedrock-agentcore:CreateConsentPortal",
        "bedrock-agentcore:GetConsentPortal",
        "bedrock-agentcore:ListConsentPortals",
        "bedrock-agentcore:CreateOauth2CredentialProvider",
        "bedrock-agentcore:GetOauth2CredentialProvider",
        "bedrock-agentcore:ListOauth2CredentialProviders",
        "bedrock-agentcore:GetGateway",
        "bedrock-agentcore:ListGateways",
        "bedrock-agentcore:CreateGatewayTarget",
        "bedrock-agentcore:GetGatewayTarget",
        "bedrock-agentcore:ListGatewayTargets",
        "bedrock-agentcore:UpdateGatewayTarget"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CreateAndPassExecutionRole",
      "Effect": "Allow",
      "Action": [
        "iam:CreateRole",
        "iam:GetRole",
        "iam:PutRolePolicy",
        "iam:GetRolePolicy",
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::111122223333:role/service-role/AmazonBedrockAgentCoreConsentPortal*"
    }
  ]
}

Passo 2: Configurar o aplicativo no IdP corporativo

No IdP corporativo, o administrador cria um aplicativo web OpenID Connect (OIDC) para o Consent Portal. É necessário habilitar o grant de código de autorização, gerar um client ID e um client secret, e configurar os escopos de login — no mínimo openid. O administrador também deve registrar a URL de descoberta OIDC, que o portal usa para localizar o endpoint de autorização, o endpoint de token e as chaves de assinatura.

Um ponto importante: o IdP precisa emitir um Token Web JSON (JWT) de acesso que o portal consiga validar. No caso do Okta, isso exige um servidor de autorização customizado com uma política de acesso adequada. No Auth0, pode ser necessário configurar um audience para que o IdP retorne um JWT assinado em vez de um token opaco.

Passo 3: Criar o provedor de credenciais do IdP

O portal lê o client ID e o client secret do IdP a partir de um provedor de credenciais OAuth2. No console do Amazon Bedrock AgentCore, em Build > Identity > Outbound Auth, o administrador adiciona um novo cliente OAuth com o nome, o client ID, o client secret e a configuração de descoberta OIDC do IdP corporativo.

Passo 4: Verificar os pré-requisitos de saída

Antes de criar o Consent Portal, é necessário confirmar que:

  • Os aplicativos OAuth do GitHub e do Slack estão registrados, com seus client secrets armazenados no AWS Secrets Manager.
  • O AgentCore Identity possui provedores de credenciais OAuth separados para GitHub e Slack, e a URL de callback gerada por cada um está registrada no respectivo aplicativo provedor.
  • Os alvos do gateway para GitHub e Slack usam o grant de código de autorização, solicitam apenas os escopos necessários e estão com status Ready.
  • A role de execução do Consent Portal consegue ler os secrets gerenciados pelo cliente referenciados pelos provedores de credenciais de saída.

Passo 5: Criar o Consent Portal

Na página de Identity do console, a seção Consent portals lista os portais existentes na conta e região. Para criar um novo portal, o administrador define um nome (de 1 a 50 caracteres, usando letras, números, hífens e underscores), uma descrição opcional de até 512 caracteres, e seleciona o gateway do assistente de desenvolvimento.

Vale destacar: o nome do gateway fica visível para os usuários finais no Consent Portal, então é importante escolher um nome claro e reconhecível. Além disso, cada gateway suporta apenas um Consent Portal, e o gateway não pode ser alterado após a criação.

Nas configurações de credenciais do IdP, o administrador seleciona o provedor OAuth2 criado no Passo 3 e mantém o escopo openid como obrigatório. Para as permissões, o console oferece a opção de criar automaticamente uma service role com as permissões necessárias.

Enquanto o portal está sendo provisionado, o Número de Recurso da Amazon (ARN) e a role de execução já ficam visíveis, mas a URL ainda não é atribuída. Quando o provisionamento termina, o status muda para Active e a URL do portal passa a aparecer no console, seguindo o padrão https://<gateway-name>.consent-portal.bedrock-agentcore.<region>.amazonaws.com.

Passo 6: Registrar as URLs de callback e compartilhar o portal

Com a URL do portal em mãos, o administrador precisa atualizar as configurações de callback em três lugares distintos:

  • No aplicativo do IdP corporativo (Cognito, Okta, Auth0, etc.): substituir o callback temporário por <portal-url>/callback.
  • Em cada alvo 3LO do gateway: definir a URL de retorno padrão como <portal-url>/connect/callback.
  • Nos aplicativos GitHub e Slack: confirmar que a callbackUrl gerada pelo AgentCore Identity já está registrada (isso deve ter sido feito no Passo 4).

Após validar tudo em um navegador, o administrador compartilha a URL do portal com a equipe de desenvolvimento por um canal de comunicação aprovado.

Experiência do usuário final (Passo 7)

Com a URL em mãos, o desenvolvedor acessa o portal no navegador, clica em Sign in e é redirecionado para o IdP corporativo. Após autenticar com as credenciais corporativas, o portal usa sua role de execução IAM para recuperar os alvos configurados no gateway e seus estados de conexão.

Na página de Conexões, o desenvolvedor vê os clientes OAuth do GitHub e do Slack com seus respectivos status. Ao clicar em Connect para o GitHub, o GitHub exibe os escopos e os acessos de organização solicitados pelo aplicativo OAuth para que o usuário os aprove.

Imagem original — fonte: Aws

Após o GitHub retornar o resultado da autorização, o portal conclui a vinculação de sessão e exibe o cliente OAuth e o alvo como Connected. O Slack, por sua vez, permanece como Not connected — demonstrando que os consentimentos são independentes para cada provedor.

Imagem original — fonte: Aws

Se o agente precisar do Slack, o desenvolvedor pode conectar esse provedor de forma análoga. Caso contrário, basta deixar desconectado até que seja necessário. Após conceder o acesso, o desenvolvedor retorna à IDE ou ao cliente MCP configurado para usar o mesmo AgentCore Gateway e executa normalmente as chamadas de ferramentas do GitHub ou Slack.

O que acontece por baixo dos panos

O fluxo técnico interno funciona da seguinte forma:

  • O portal valida a resposta do IdP e estabelece uma sessão de navegador criptografada.
  • Usando sua role de execução, o portal lista os alvos 3LO do gateway associado.
  • Quando o usuário clica em Connect, o portal chama GetResourceOauth2Token e recebe uma URL de autorização e um URI de sessão.
  • Após o provedor retornar o código de autorização ao AgentCore Identity, o navegador é redirecionado para o endpoint gerenciado de vinculação de sessão do portal.
  • O portal chama CompleteResourceTokenAuth com o contexto do usuário autenticado.
  • Quando o provedor retorna um refresh token, o AgentCore Identity o armazena e o usa automaticamente para obter novos access tokens após a expiração do token atual.

Caso nenhum refresh token válido esteja disponível — porque o provedor não emitiu um, ou ele expirou ou foi revogado — o usuário precisa retornar ao Consent Portal e reautorizar. A AWS recomenda configurar os provedores para emitir refresh tokens sempre que suportado: por exemplo, habilitando a expiração de tokens user-to-server no GitHub ou a rotação de tokens no Slack.

Na próxima vez que o desenvolvedor abrir o portal, os provedores já conectados continuam visíveis como conectados. Não é necessário aprovar novamente, a menos que o grant seja revogado, expire ou exija novo consentimento. O desenvolvedor também pode desconectar um provedor e reconectá-lo posteriormente.

Auditoria com AWS CloudTrail

O Amazon Bedrock AgentCore registra as operações de consentimento no AWS CloudTrail. Para auditar a atividade, basta filtrar o histórico de eventos pela fonte bedrock-agentcore.amazonaws.com e revisar os seguintes eventos:

  • GetResourceOauth2Token: quando o portal inicia a autorização OAuth para um provedor.
  • CompleteResourceTokenAuth: quando a vinculação de sessão é concluída.
  • GetWorkloadAccessTokenForJWT: quando o portal obtém acesso ao gateway para o usuário autenticado.

Um evento GetResourceOauth2Token identifica o provedor de credenciais, os escopos solicitados, o fluxo OAuth, a role de execução do portal e a região. Valores sensíveis de token e estado são ocultados. O exemplo abaixo mostra a estrutura do evento:

{
  "eventSource": "bedrock-agentcore.amazonaws.com",
  "eventName": "GetResourceOauth2Token",
  "awsRegion": "ap-southeast-2",
  "userIdentity": {
    "type": "AssumedRole",
    "arn": "arn:aws:sts::111122223333:assumed-role/AmazonBedrockAgentCoreConsentPortalDefaultServiceRole-example/consent-dashboard-example"
  },
  "requestParameters": {
    "workloadIdentityToken": "HIDDEN_DUE_TO_SECURITY_REASONS",
    "resourceCredentialProviderName": "gateway-demo-github",
    "scopes": ["read:user", "repo"],
    "oauth2Flow": "USER_FEDERATION",
    "customState": "HIDDEN_DUE_TO_SECURITY_REASONS"
  },
  "resources": [
    {
      "accountId": "111122223333",
      "type": "AWS::BedrockAgentCore::OAuth2CredentialProvider",
      "ARN": "arn:aws:bedrock-agentcore:ap-southeast-2:111122223333:token-vault/default/oauth2credentialprovider/gateway-demo-github"
    }
  ],
  "managementEvent": true
}

Em caso de falhas, os campos errorCode e errorMessage, combinados com o horário do evento, a role assumida, a região, o provedor de credenciais e os escopos solicitados, ajudam a identificar a causa.

Limpeza dos recursos

Quando os recursos não forem mais necessários, a AWS recomenda a seguinte ordem de remoção:

  • Excluir o Consent Portal no console do Amazon Bedrock AgentCore.
  • Remover as URLs de callback do portal no aplicativo do IdP corporativo e nos alvos do gateway.
  • Excluir os alvos do gateway que referenciam os provedores de credenciais de saída.
  • Excluir os provedores de credenciais OAuth de saída e o provedor de credenciais do IdP corporativo, se não estiverem sendo usados em outro lugar.
  • Excluir a role de execução do portal, se nenhum outro recurso a utilizar.

Atenção: é necessário excluir o alvo do gateway antes de excluir seu provedor de credenciais de saída. Um provedor ainda referenciado por um alvo não pode ser excluído.

Exemplos e documentação adicional

Para exemplos completos usando Microsoft Entra ID e Okta, a AWS disponibilizou repositórios no GitHub com os seguintes materiais:

Para saber mais, acesse a página do Amazon Bedrock AgentCore.

Fonte

Manage end-user OAuth consent for AI agents with Amazon Bedrock AgentCore (https://aws.amazon.com/blogs/machine-learning/manage-end-user-oauth-consent-for-ai-agents-with-amazon-bedrock-agentcore/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *