View a markdown version of this page

Autenticar y autorizar con autenticación entrante y autenticación saliente - Amazon Bedrock AgentCore

Autenticar y autorizar con autenticación entrante y autenticación saliente

En esta sección, se muestra cómo implementar la autenticación y la autorización para el tiempo de ejecución de su agente mediante los tokens portadores de OAuth y JWT con Identity. AgentCore Aprenderá a configurar grupos de usuarios de Cognito, configurar el tiempo de ejecución del agente para la autenticación JWT (autenticación entrante) e implementar el OAuth-based acceso a recursos de terceros (autenticación saliente).

Para ver un ejemplo completo, consulte. https://github.com/awslabs/amazon-bedrock-agentcore-samples/

Para obtener información sobre el uso de OAuth con un servidor MCP, consulte Implementación de servidores MCP en tiempo de ejecución. AgentCore

El tiempo de AgentCore ejecución de Amazon Bedrock proporciona dos mecanismos de autenticación para los agentes alojados:

Autenticación SigV4 de IAM

El mecanismo de autenticación y autorización predeterminado que funciona automáticamente sin configuración adicional, de forma similar a otras AWS API.

X-Amzn-Bedrock-AgentCore-Runtime-User-Id Encabezado

Si tu solución requiere que el agente hospedado recupere los tokens de OAuth en nombre de los usuarios finales (mediante Authorization Code Grant), puedes especificar el identificador de usuario incluyendo el X-Amzn-Bedrock-AgentCore-Runtime-User-Id encabezado en tus solicitudes. Este encabezado usa la GetWorkloadAccessTokenForUserId ruta internamente.

nota

La invocación InvokeAgentRuntime con el X-Amzn-Bedrock-AgentCore-Runtime-User-Id header requerirá una nueva acción de IAM:bedrock-agentcore:InvokeAgentRuntimeForUser, además de la acción existentebedrock-agentcore:InvokeAgentRuntime.

Cuándo usar este encabezado en lugar de usar la autenticación con JWT Bearer Token

Este encabezado está diseñado para los siguientes casos de uso:

  • Clientes empresariales con identificadores de usuario gestionados por el cliente: Organizaciones que mantienen sus propias cadenas de identidad de usuario y necesitan pasarlas a AgentCore Identity para la vinculación de credenciales.

  • Escenarios de desarrollo e inicio rápido: creadores que aún no tienen un token de IdP disponible y necesitan una ruta rápida para probar los flujos de credenciales de alcance de los usuarios.

    Para las implementaciones de producción en las que haya configurado un proveedor de identidades, utilice en su lugar la autenticación JWT Bearer Token. La ruta JWT (GetWorkloadAccessTokenForJWT) valida el emisor, la firma y el vencimiento del token, y proporciona una prueba criptográfica de la identidad del usuario. La ruta del X-Amzn-Bedrock-AgentCore-Runtime-User-Id encabezado no compara el USERID con la identidad de un usuario final autenticado; se basa en la carga de trabajo de llamadas para transferir el valor correcto y en las políticas de IAM para restringir quién puede proporcionarlo.

    Prácticas recomendadas de seguridad para el encabezado X-Amzn-Bedrock-AgentCore-Runtime-User-Id

    sugerencia

    Para obtener una vista consolidada de todas las recomendaciones de seguridad en tiempo de ejecución, consulte las prácticas recomendadas de seguridad para entornos AgentCore de ejecución.

    Como AgentCore trata el valor del encabezado como un identificador opaco sin compararlo con una identidad autenticada, debe aplicar los siguientes controles para mantener el límite de seguridad:

  • Restrinja el permiso de IAM: solo los directores de confianza deben tener el permiso. bedrock-agentcore:InvokeAgentRuntimeForUser Limite este permiso a recursos de tiempo de ejecución específicos utilizando las condiciones de los recursos de IAM. No lo concedas de forma generalizada mediante políticas gestionadas o declaraciones de recursos comodín.

  • Obtenga el identificador de usuario del usuario principal autenticado: el valor del identificador de usuario debe derivarse del contexto del usuario autenticado (por ejemplo, la identidad de la persona que llama a IAM o las afirmaciones sobre el token de usuario) en lugar de aceptar valores arbitrarios proporcionados por el cliente. Esto evita que un usuario autenticado se haga pasar por otro usuario especificando manualmente otro usuario diferente. user-id

  • Implemente el registro de auditoría: registre la relación entre el principal de IAM autenticado (en el contexto de SigV4) y el valor que se transfiere. user-id Se utiliza AWS CloudTrail para supervisar las InvokeAgentRuntime llamadas que incluyen el parámetro. runtimeUserId

  • Denegar el encabezado en contextos que no sean de confianza: en los tiempos de ejecución en los que no sea necesaria la delegación del identificador de usuario, deniegue explícitamente la bedrock-agentcore:InvokeAgentRuntimeForUser acción en las políticas de IAM para impedir que se acepte el encabezado:

    { "Statement": [ { "Sid": "DenyUserIdDelegation", "Effect": "Deny", "Action": "bedrock-agentcore:InvokeAgentRuntimeForUser", "Resource": "arn:aws:bedrock-agentcore:REGION:ACCOUNT_ID:runtime/*" } ] }
Autenticación con token JWT Bearer

Puede configurar el tiempo de ejecución de su agente para que acepte los tokens portadores de JWT proporcionando la configuración del autorizador durante la creación del agente.

Esta configuración incluye:

  • URL de descubrimiento: cadena que debe coincidir con el patrón de las URL ^.+/\.well-known/openid-configuration$ de descubrimiento de OpenID Connect

  • Audiencias permitidas: una lista de audiencias permitidas que se validará con la afirmación aud del token JWT

  • Clientes permitidos: una lista de identificadores de clientes permitidos que se validarán con la afirmación client_id del token JWT

  • Ámbitos permitidos: una lista de ámbitos permitidos que se validará con la afirmación de alcance del token JWT. El campo allowedScopes de autorización se configurará como una lista de cadenas.

  • Reclamaciones personalizadas obligatorias: una lista de las notificaciones obligatorias que se validarán con el nombre y el valor de la reclamación que figuran en el token JWT entrante. Para obtener más información sobre la configuración del autorizador, consulte Configurar el autorizador JWT entrante

nota

Un AgentCore motor de ejecución puede admitir la autenticación entrante basada en SiGv4 de IAM o en el token JWT Bearer, pero no ambas simultáneamente. Siempre puede crear diferentes versiones de su AgentCore Runtime y configurarlas para distintos tipos de autorización entrante. Cuando crea un entorno de ejecución con Amazon Bedrock AgentCore, se crea automáticamente una identidad de carga de trabajo para su entorno de ejecución con el servicio AgentCore Identity.

Restrinja la invocación entrante de IAM (SiGv4) a su puerta de enlace

Puede gestionar su AgentCore tiempo de ejecución con una AgentCore puerta de enlace para que la puerta de enlace se convierta en el único punto de entrada gobernado al tiempo de ejecución, lo que le proporciona una autorización basada en políticas, Amazon Bedrock Guardrails, interceptores de solicitudes y respuestas y una observabilidad unificada, todo ello aplicado fuera del entorno del agente. Para obtener información completa sobre los motivos y cómo configurarlo, consulte Cómo gestionar su tiempo de ejecución con una puerta de enlace. AgentCore

Sin embargo, esto solo es útil si las personas que llaman no pueden llegar al motor de ejecución directamente sin pasar por la puerta de enlace. Si su entorno de ejecución utiliza la autorización de entrada predeterminada de IAM (SiGv4), puede restringir la invocación a la puerta de enlace para que el tráfico llegue al entorno de ejecución únicamente a través de ella. Para lograrlo, adjunte al tiempo de ejecución una política basada en recursos que restrinja la invocación a la función de ejecución de la puerta de enlace. La puerta de enlace asume su función de servicio para firmar las solicitudes al tiempo de ejecución, por lo que la función de puerta de enlace es la principal que invoca el tiempo de ejecución. Permita esa función y añada una explícita Deny para todos los demás principios, de modo que ninguna otra identidad pueda invocar el tiempo de ejecución, incluso con una política permisiva basada en la identidad. Para obtener más información sobre las políticas basadas en recursos en tiempos de ejecución, consulte las políticas de Amazon Resource-based Bedrock. AgentCore

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowOnlyGatewayRole", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyGatewayExecutionRole" }, "Action": "bedrock-agentcore:InvokeAgentRuntime", "Resource": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/RUNTIME_ID" }, { "Sid": "DenyOtherPrincipals", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "bedrock-agentcore:InvokeAgentRuntime", "Resource": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/RUNTIME_ID", "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::111122223333:role/MyGatewayExecutionRole" } } } ] }
sugerencia

Una política explícita Deny siempre anula cualquier política de la misma cuentaAllow, incluidas las políticas basadas en la identidad. Al activarla, se aws:PrincipalArn garantiza que solo la Deny función de ejecución de la puerta de enlace pueda invocar el tiempo de ejecución, independientemente de los demás permisos que existan en su cuenta.

importante

Restringir el tiempo de ejecución a la función de ejecución de la puerta de enlace solo es tan fuerte como los controles sobre quién puede asumir esa función. Cualquier director que pueda asumir la función de ejecución de la puerta de enlace puede invocar el tiempo de ejecución como si fuera la puerta de enlace. Bloquee la función añadiendo aws:SourceArn aws:SourceAccount condiciones a la política de confianza de la función de ejecución de la puerta de enlace para que solo su puerta de enlace pueda asumirla. La guía de prevención de adjuntos confusos muestra la misma técnica que se aplica a la función de ejecución de un entorno de ejecución; en este caso, aplique el mismo patrón, pero establezca la política de confianza en la función y el alcance de ejecución de la puerta de enlace en el aws:SourceArn ARN de la puerta de enlace.

Ejemplo de autorización entrante de JWT y acceso saliente de OAuth

Esta guía explica el proceso de configuración del tiempo de ejecución del agente para que se invoque con un token de acceso compatible con OAuth y en formato JWT. El agente de muestra estará autorizado mediante los tokens de acceso de AWS Cognito. Más adelante, también aprenderá cómo el código del agente puede obtener tokens de Google en nombre del usuario para consultar Google Drive y buscar contenido.

¿Qué aprenderás

En esta guía, aprenderás a:

  • Configure el grupo de usuarios de Cognito, añada un usuario y obtenga un token de portador para el usuario

  • Configure el tiempo de ejecución del agente para usar el grupo de usuarios de Cognito para la autorización

  • Configure el código de su agente para obtener los tokens de OAuth en nombre del usuario para llamar a las herramientas

Requisitos previos

Antes de empezar, asegúrese de que tiene lo siguiente:

  • Una AWS cuenta con los permisos adecuados

  • Comprensión básica de la programación en Python

  • Familiaridad con los contenedores Docker (para una implementación avanzada)

  • Configure correctamente un agente básico con tiempo de ejecución

  • La AWS CLI más reciente e jq instalada

  • Conocimientos básicos de la autorización de OAuth, principalmente los tokens portadores de JWT, las solicitudes y los distintos flujos de subvenciones

Paso 1: Crea tu proyecto de agente

Utilice el agentcore create comando para configurar un proyecto de agente básico con el marco que prefiera:

agentcore create

El comando le pedirá que:

  • Elija un marco (elija Strands Agents para este tutorial)

  • Proporcione un nombre de proyecto

  • Configuración de opciones adicionales

Esto genera:

  • Código de agente con el marco seleccionado

  • Archivo de configuración de la agentcore/agentcore.json

  • requirements.txtcon las dependencias necesarias

nota

El código de agente generado servirá de base para implementar la autenticación OAuth en los siguientes pasos.

Paso 2: Configurar AWS Grupo de usuarios de Cognito y añadir un usuario

Para configurar un grupo de usuarios de Cognito y crear un usuario, utilizará un script de shell que automatiza el proceso.

Para obtener más información, consulte el paso 2: Importar los módulos de identidad y autenticación.

Para configurar el grupo de usuarios de Cognito y crear un usuario

  • Cree un archivo denominado setup_cognito.sh con el siguiente contenido:

    #!/bin/bash # Create User Pool and capture Pool ID directly export POOL_ID=$(aws cognito-idp create-user-pool \ --pool-name "MyUserPool" \ --policies '{"PasswordPolicy":{"MinimumLength":8}}' \ --region $REGION | jq -r '.UserPool.Id') # Create App Client and capture Client ID directly export CLIENT_ID=$(aws cognito-idp create-user-pool-client \ --user-pool-id $POOL_ID \ --client-name "MyClient" \ --no-generate-secret \ --explicit-auth-flows "ALLOW_USER_PASSWORD_AUTH" "ALLOW_REFRESH_TOKEN_AUTH" \ --region $REGION | jq -r '.UserPoolClient.ClientId') # Create User aws cognito-idp admin-create-user \ --user-pool-id $POOL_ID \ --username $USERNAME \ --region $REGION \ --message-action SUPPRESS > /dev/null # Set Permanent Password aws cognito-idp admin-set-user-password \ --user-pool-id $POOL_ID \ --username $USERNAME \ --password $PASSWORD \ --region $REGION \ --permanent > /dev/null # Authenticate User and capture Access Token export BEARER_TOKEN=$(aws cognito-idp initiate-auth \ --client-id "$CLIENT_ID" \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD \ --region $REGION | jq -r '.AuthenticationResult.AccessToken') # Output the required values echo "Pool id: $POOL_ID" echo "Discovery URL: https://cognito-idp.$REGION.amazonaws.com/$POOL_ID/.well-known/openid-configuration" echo "Client ID: $CLIENT_ID" echo "Bearer Token: $BEARER_TOKEN"

    Abra una ventana de terminal y configure las siguientes variables de entorno:

    • REGION— la AWS región que desea usar

    • USERNAME— el nombre de usuario del nuevo usuario

    • PASSWORD— la contraseña del nuevo usuario

      export REGION=us-east-1 // set your desired Region export USERNAME=USER NAME export PASSWORD=PASSWORD

      En la ventana del terminal, ejecute el script:

      source setup_cognito.sh

      Anote el resultado del script. Necesitará estos valores en los siguientes pasos.

Este script crea un grupo de usuarios de Cognito, un cliente de grupo de usuarios, añade un usuario y genera un token de portador para el usuario. De forma predeterminada, el token es válido durante 60 minutos.

Paso 3 (opcional): Controle su tiempo de ejecución con una AgentCore puerta de enlace

Puede gestionar su AgentCore tiempo de ejecución con una AgentCore puerta de enlace para que la puerta de enlace se convierta en el único punto de entrada gobernado al tiempo de ejecución, lo que le proporciona una autorización basada en políticas, Amazon Bedrock Guardrails, interceptores de solicitudes y respuestas y una observabilidad unificada, todo ello aplicado fuera del entorno del agente. Para obtener información completa sobre los motivos y cómo configurarlo, consulte Cómo gestionar su tiempo de ejecución con una puerta de enlace. AgentCore

Si desea aprovechar este tiempo de ejecución, cree la puerta de enlace ahora, antes de implementar el tiempo de ejecución en el siguiente paso. Tras la implementación, añadirá el tiempo de ejecución como destino de la puerta de enlace.

Para asegurarte de que las personas que llaman no puedan pasar por alto la puerta de enlace, restringe el tiempo de ejecución para que solo acepte invocaciones desde esa puerta de enlace. Esto se configura en el siguiente paso, como parte del autorizador, mediante allowedWorkloadConfiguration (consulte PermitidoWorkloadConfiguration: restringir la invocación a su puerta de enlace).

Paso 4: Despliegue su agente

importante

A partir del 13 de octubre de 2025, Amazon Bedrock AgentCore utilizará un Service-Linked rol (SLR) para los permisos de identidad de la carga de trabajo en lugar de requerir la configuración manual de la política de IAM para los nuevos agentes.

Detalles Service-Linked del rol:

  • Nombre: AWSServiceRoleForBedrockAgentCoreRuntimeIdentity

  • Director de servicio: runtime-identity.bedrock-agentcore.amazonaws.com

  • Propósito: Administra la carga de trabajo, la identidad, los tokens de acceso y las credenciales de OAuth

Asegúrese de que la función que utiliza para invocar las API AgentCore de control tenga permiso para crear la función: Service-Linked

{ "Sid": "CreateBedrockAgentCoreIdentityServiceLinkedRolePermissions", "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::*:role/aws-service-role/runtime-identity.bedrock-agentcore.amazonaws.com/AWSServiceRoleForBedrockAgentCoreRuntimeIdentity", "Condition": { "StringEquals": { "iam:AWSServiceName": "runtime-identity.bedrock-agentcore.amazonaws.com" } } }

Ventaja: el Service-Linked rol proporciona automáticamente los permisos necesarios para el acceso a la identidad de la carga de trabajo sin necesidad de configurar las políticas manualmente.

Para obtener información detallada sobre el rol vinculado al servicio, consulte Identity al rol vinculado al servicio.

Ahora implementará su agente con la autorización de JWT mediante el grupo de usuarios de Cognito que creó. Deberá crear un agente con la configuración de autorizador. La siguiente tabla representa los distintos parámetros de configuración del autorizador y cómo los utilizamos para validar el token entrante.

authorizer_configuration reclamación en un token decodificado Notas

url de descubrimiento → emisor

iss

La URL de descubrimiento debe apuntar a la URL del emisor. Debe coincidir con la afirmación iss del token decodificado.

Clientes permitidos

client_id

El client_id del token debe coincidir con uno de los clientes permitidos especificados en el autorizador

Público permitido

aud

Uno de los valores de la afirmación aud del token debe coincidir con uno de los públicos permitidos especificados en el autorizador

permitido WorkloadConfiguration

internal

Opcional. En el momento del lanzamiento, se utiliza para permitir que solo tu AgentCore Gateway invoque el tiempo de ejecución. Consulte Restringir la invocación a su puerta de enlace.

Si se proporcionan client_id y aud, el autorizador de tiempo de ejecución del agente verificará ambos.

permitidoWorkloadConfiguration: restrinja la invocación a su puerta de enlace

El allowedWorkloadConfiguration campo correspondiente customJWTAuthorizer restringe las cargas de trabajo de la cadena de identidad de la solicitud que pueden invocar el tiempo de ejecución. Configura la carga de trabajo permitida en tu puerta de enlace para que el motor de ejecución solo acepte una solicitud cuando su cadena de identidad incluya esa puerta de enlace. Así es como un entorno de ejecución de OAuth (JWT) exige que el tráfico llegue únicamente a través de la puerta de enlace que configuraste en el paso 3.

Las cargas de trabajo permitidas se proporcionan mediante uno de los siguientes campos. Puede especificar uno o ambos: se acepta una solicitud si su cadena de identidad coincide con una entrada de cualquiera de los campos, por lo que no es necesario que proporcione ambos.

  • HostingEnvironments: una lista de entornos de alojamiento cuyas cargas de trabajo pueden invocar el destino. Cada entrada es un objeto con un. arn En el momento del lanzamiento, el único entorno de alojamiento compatible es AgentCore Gateway, por lo que cada uno arn debe ser un ARN de AgentCore Gateway.

  • Identidades de carga de trabajo: una lista de nombres de identidad de carga de trabajo que pueden invocar el destino. El nombre de identidad de una carga de trabajo no es un ARN. Es el segmento final del ARN de identidad de carga de trabajo de la puerta de enlace, que puede encontrar en el workloadIdentityDetails campo de la GetGateway respuesta. Por ejemplo, si workloadIdentityDetails.workloadIdentityArn es asíarn:aws:bedrock-agentcore:us-east-1:111122223333:workload-identity-directory/default/workload-identity/my-gateway-workload-identity, el nombre de identidad de la carga de trabajo esmy-gateway-workload-identity.

El siguiente ejemplo crea un agente en tiempo de ejecución que restringe la invocación a una AgentCore puerta de enlace específica por su ARN. La forma más sencilla de permitir una puerta de enlace es especificarla por hostingEnvironments sí sola:

{ "authorizerConfiguration": { "customJWTAuthorizer": { "discoveryUrl": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example/.well-known/openid-configuration", "allowedClients": ["your-client-id"], "allowedWorkloadConfiguration": { "hostingEnvironments": [ { "arn": "arn:aws:bedrock-agentcore:us-east-1:111122223333:gateway/my-gateway-id" } ] } } } }

Como alternativa, puede identificar la puerta de enlace por su nombre de identidad de carga de trabajo o especificar ambos campos. Cuando ambos están presentes, se permite una solicitud si coincide con una entrada de cualquiera de los campos. El siguiente allowedWorkloadConfiguration fragmento permite dos puertas de enlace diferentes, una identificada por su ARN y otra por su nombre de identidad de carga de trabajo:

"allowedWorkloadConfiguration": { "hostingEnvironments": [ { "arn": "arn:aws:bedrock-agentcore:us-east-1:111122223333:gateway/my-gateway-1-id" } ], "workloadIdentities": [ "my-gateway-2-workload-identity" ] }
nota

En el momento del lanzamiento, solo allowedWorkloadConfiguration es compatible con los destinos en AgentCore tiempo de ejecución y las cargas de trabajo permitidas son las puertas de enlace. AgentCore

Cree e implemente el agente (en tiempo de ejecución)

Con la configuración del autorizador lista, cree e implemente el tiempo de ejecución del agente. Los siguientes ejemplos muestran cómo hacerlo con la AgentCore CLI o el AWS SDK para Python (Boto3). Anote el ARN del tiempo de ejecución del agente en el resultado; lo necesitará para invocar al agente en el siguiente paso.

ejemplo
AgentCore CLI

Para configurar e implementar su agente

  1. Cree su proyecto de agente con la AgentCore CLI:

    agentcore create

    Cuando se le solicite, elija su marco (elija Strands Agents para este tutorial).

  2. Despliega a tu agente:

    agentcore deploy
  3. Anote el ARN del tiempo de ejecución del agente en el resultado. Lo necesitará en el siguiente paso.

    sugerencia

    También puede ejecutar el agentcore create comando sin indicadores para disfrutar de una experiencia totalmente interactiva que le guiará durante la configuración del proyecto.

Python
  1. import boto3 # Create the client client = boto3.client('bedrock-agentcore-control', region_name="us-east-1") # Call the CreateAgentRuntime operation response = client.create_agent_runtime( agentRuntimeName='HelloAgent', agentRuntimeArtifact={ 'containerConfiguration': { 'containerUri': '111122223333.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest' } }, authorizerConfiguration={ "customJWTAuthorizer": { "discoveryUrl": 'COGNITO_DISCOVERY_URL', "allowedClients": ['COGNITO_CLIENT_ID'] } }, networkConfiguration={"networkMode":"PUBLIC"}, roleArn='arn:aws:iam::111122223333:role/AgentRuntimeRole', lifecycleConfiguration={ 'idleRuntimeSessionTimeout': 300, # 5 min, configurable 'maxLifetime': 1800 # 30 minutes, configurable }, )

Paso 5: Usa el token de portador para invocar a tu agente

Ahora que tu agente está desplegado con la autorización de JWT, puedes invocarlo con el token portador.

nota

Si en el paso 3 utilizaste una puerta de enlace para el tiempo de ejecución, añade el tiempo de ejecución implementado como destino de la puerta de enlace antes de invocarlo (consulta Destinos del tiempo de AgentCore ejecución) y, a continuación, invoca a través del punto final de la puerta de enlace que se muestra en los ejemplos siguientes, en lugar del punto final del tiempo de ejecución.

importante

Importante para los usuarios actuales: los agentes creados antes del 13 de octubre de 2025 seguirán utilizando la función de ejecución de agentes para obtener permisos de identidad y deberán adjuntar la política anterior a la función de ejecución del agente.

Agentes nuevos: en el caso de los agentes creados a partir del 13 de octubre de 2025, esta política no es obligatoria, ya que el Service-Linked rol gestiona los permisos automáticamente.

{ "Sid": "GetAgentAccessToken", "Effect": "Allow", "Action": [ "bedrock-agentcore:GetWorkloadAccessToken", "bedrock-agentcore:GetWorkloadAccessTokenForJWT", "bedrock-agentcore:GetWorkloadAccessTokenForUserId" ], # point to the workload identity for the runtime; the workload identity can be found in # the GetAgentRuntime response and has your agent name in it. "Resource": [ "arn:aws:bedrock-agentcore:region:account-id:workload-identity-directory/default", "arn:aws:bedrock-agentcore:region:account-id:workload-identity-directory/default/workload-identity/agentname-*" ] }

Invoca al agente

Obtenga un token de portador para el usuario que creó con Amazon Cognito.

# use the password and other details used when you created the cognito user export TOKEN=$(aws cognito-idp initiate-auth \ --client-id "$CLIENT_ID" \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME='testuser',PASSWORD='PASSWORD' \ --region us-east-1 | jq -r '.AuthenticationResult.AccessToken')

Proceda a invocar al agente siguiendo el resto de las instrucciones siguientes.

Invoca al agente con OAuth.

ejemplo
Use cURL
  1. // Invoke with OAuth token export PAYLOAD='{"prompt": "hello what is 1+1?"}' export BEDROCK_AGENT_CORE_ENDPOINT_URL="https://bedrock-agentcore.us-east-1.amazonaws.com" # If you fronted the runtime with a gateway (Step 3), the core endpoint URL is now your gateway URL # export BEDROCK_AGENT_CORE_ENDPOINT_URL="https://${GATEWAY_ID}.gateway.bedrock-agentcore.us-east-1.amazonaws.com/${TARGET_NAME}" export INVOKE_URL="${BEDROCK_AGENT_CORE_ENDPOINT_URL}/runtimes/${ESCAPED_AGENT_ARN}/invocations?qualifier=DEFAULT" # If you fronted the runtime with a gateway (Step 3), the preceding URL works but there is also a simpler alternative: # export INVOKE_URL="${BEDROCK_AGENT_CORE_ENDPOINT_URL}/invocations" curl -v -X POST "${INVOKE_URL}" \ -H "Authorization: Bearer ${TOKEN}" \ -H "X-Amzn-Trace-Id: your-trace-id" \ -H "Content-Type: application/json" \ -H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: your-session-id" \ -d ${PAYLOAD}
Use Python
  1. Como boto3 no admite la invocación con tokens portadores, necesitarás usar un cliente HTTP como la biblioteca de solicitudes de Python.

    Para invocar a tu agente con un token portador

  2. Cree un script de Python denominado invoke_agent.py con el siguiente contenido:

    import requests import urllib.parse import json import os # Configuration Constants REGION_NAME = "AWS_REGION" # === Agent Invocation Demo === invoke_agent_arn = "YOUR_AGENT_ARN_HERE" auth_token = os.environ.get('TOKEN') print(f"Using Agent ARN from environment: {invoke_agent_arn}") # URL encode the agent ARN escaped_agent_arn = urllib.parse.quote(invoke_agent_arn, safe='') # Construct the URL — invoke the runtime directly url = f"https://bedrock-agentcore.{REGION_NAME}.amazonaws.com/runtimes/{escaped_agent_arn}/invocations?qualifier=DEFAULT" # If you are fronting the runtime with a gateway (see Step 3), invoke through # the gateway target instead (replace GATEWAY_ID and my-target): # url = f"https://GATEWAY_ID.gateway.bedrock-agentcore.{REGION_NAME}.amazonaws.com/my-target/invocations" # Set up headers headers = { "Authorization": f"Bearer {auth_token}", "X-Amzn-Trace-Id": "your-trace-id", "Content-Type": "application/json", "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": "testsession123" } # Enable verbose logging for requests import logging logging.basicConfig(level=logging.DEBUG) logging.getLogger("urllib3.connectionpool").setLevel(logging.DEBUG) invoke_response = requests.post( url, headers=headers, data=json.dumps({"prompt": "Hello what is 1+1?"}) ) # Print response in a safe manner print(f"Status Code: {invoke_response.status_code}") print(f"Response Headers: {dict(invoke_response.headers)}") # Handle response based on status code if invoke_response.status_code == 200: response_data = invoke_response.json() print("Response JSON:") print(json.dumps(response_data, indent=2)) elif invoke_response.status_code >= 400: print(f"Error Response ({invoke_response.status_code}):") error_data = invoke_response.json() print(json.dumps(error_data, indent=2)) else: print(f"Unexpected status code: {invoke_response.status_code}") print("Response text:") print(invoke_response.text[:500])
  3. AWS_REGIONReemplácela por la AWS región que está utilizando, del paso 3.

  4. YOUR_AGENT_ARN_HERESustitúyalo por el ARN de tiempo de ejecución del agente real del paso 3.

  5. Ejecute el script :

    python invoke_agent.py

Respuestas de error de OAuth

OAuth-configured los agentes siguen los estándares de autenticación RFC 6749 (OAuth 2.0). Cuando falta la autenticación, el servicio devuelve una respuesta 401 no autorizada con un WWW-Authenticate encabezado (según la RFC 7235), lo que permite a los clientes descubrir los puntos finales del servidor de autorización a través de la API. GetRuntimeProtectedResourceMetadata

401 No autorizado: falta la autenticación

Cuando no se proporciona ningún identificador de portador en el encabezado de autorización, la respuesta es:

HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer resource_metadata="https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{ESCAPED_ARN}/invocations/.well-known/oauth-protected-resource?qualifier={QUALIFIER}"

La resource_metadata URL del WWW-Authenticate encabezado apunta a la API de metadatos de recursos protegidos (PRM). La API PRM permite a los clientes descubrir qué servidores de autorización protegen a este agente y a sus URL de punto final de OAuth.

nota

Debe preregistrar su cliente OAuth en Cognito (mediante la consola AWS o la CLI) para obtener una client_id antes de utilizar los puntos finales descubiertos. Amazon Cognito no admite el registro dinámico de clientes (RFC 7591).

Paso 6: Configure su agente para que acceda a las herramientas mediante OAuth

En esta sección, aprenderás a conectar tu código de agente con los proveedores de AgentCore credenciales para un acceso seguro a los recursos externos mediante la autenticación OAuth2.

En el siguiente ejemplo, se muestra cómo un agente que se ejecuta en Agent Runtime puede solicitar el consentimiento de OAuth a los usuarios, lo que les permite autenticarse con su cuenta de Google y autorizar al agente a acceder al contenido de Google Drive.

Para obtener más información sobre cómo configurar la identidad, consulte Primeros pasos con Identity. AgentCore

Paso 6.1: Configurar los proveedores de credenciales

Para configurar un proveedor de credenciales de Google, debes:

  1. Registra tu solicitud en Google para obtener el ID y el secreto del cliente

  2. Cree un proveedor de credenciales de OAuth mediante la CLI. AWS Sustituya your-client-id y por su your-client-secret identificador de cliente y secreto de cliente actuales de Google OAuth2:

    OAUTH2_CREDENTIAL_PROVIDER_RESPONSE=$(aws bedrock-agentcore-control create-oauth2-credential-provider \ --name "google-provider" \ --credential-provider-vendor "GoogleOauth2" \ --oauth2-provider-config-input '{ "googleOauth2ProviderConfig": { "clientId": "your-client-id", "clientSecret": "your-client-secret" } }' \ --output json) OAUTH2_CALLBACK_URL=$(echo $OAUTH2_CREDENTIAL_PROVIDER_RESPONSE | jq -r '.callbackUrl') echo "OAuth2 Callback URL: $OAUTH2_CALLBACK_URL"
    nota

    Obténgalo callbackUrl de la CreateOauth2CredentialProviderrespuesta y añada el URI a la lista de URI de redireccionamiento de su aplicación de Google. La URL de devolución de llamada debería tener el siguiente aspecto: https://bedrock-agentcore.us-east-1.amazonaws.com/identities/oauth2/callback/ ********-******-**************

Asegúrese de que su función de invocación tenga los permisos necesarios para acceder al proveedor de credenciales.

Paso 6.2: Permite que el agente lea el contenido de Google Drive

Crea una herramienta con las anotaciones del SDK del núcleo del agente, como se muestra en el siguiente ejemplo, para iniciar automáticamente el triple proceso de OAuth. Cuando tu agente invoque esta herramienta, se les pedirá a los usuarios que abran la URL de autorización en su navegador y den su consentimiento para que el agente acceda a su Google Drive.

import asyncio from bedrock_agentcore.identity.auth import requires_access_token, requires_api_key # This annotation helps agent developer to obtain access tokens from external applications @requires_access_token( provider_name="google-provider", scopes=["https://www.googleapis.com/auth/drive.metadata.readonly"], # Google OAuth2 scopes auth_flow="USER_FEDERATION", # 3LO flow on_auth_url=lambda x: print("Copy and paste this authorization url to your browser: ", x), # prints authorization URL to console force_authentication=True, callback_url='insert_oauth2_callback_url_for_session_binding' ) async def read_from_google_drive(*, access_token: str): print(access_token) #You can see the access_token # Make API calls... main(access_token) asyncio.run(read_from_google_drive(access_token=""))
nota

Para ver un ejemplo de la implementación de un servidor de devolución de llamadas local para gestionar la vinculación de sesiones, consulte https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/03-AgentCore-identity/05-Outbound_Auth_3lo/oauth2_callback_server.py

¿Qué sucede entre bastidores

Cuando se ejecuta este código, se produce el siguiente proceso:

  1. Agent Runtime autoriza el token entrante de acuerdo con el autorizador configurado.

  2. Agent Runtime intercambia este token por un token de acceso a la carga de trabajo mediante la bedrock-agentcore:GetWorkloadAccessTokenForJWT API y lo envía al código de su agente a través del encabezado de carga útil. WorkloadAccessToken

  3. Durante la invocación de la herramienta, su agente utiliza este token de acceso a la carga de trabajo para llamar a la API de Token Vault bedrock-agentcore:GetResourceOauth2Token y generar una URL de autenticación de 3LO.

  4. Su agente envía esta URL a la aplicación cliente tal y como se especifica en el on_auth_url método.

  5. La aplicación cliente presenta esta URL al usuario, quien autoriza al agente a acceder a su Google Drive.

  6. AgentCore El servicio de identidad recibe y almacena en caché de forma segura el token de acceso de Google hasta que caduca, lo que permite que el usuario utilice este token en sucesivas solicitudes sin necesidad de que el usuario dé su consentimiento para cada solicitud.

nota

AgentCore Identity Service almacena el token de acceso de Google en AgentCore Token Vault utilizando la identidad de la carga de trabajo del agente y el ID de usuario (del token JWT entrante, como el token de Cognito AWS ) como clave de enlace, lo que elimina las solicitudes de consentimiento repetidas hasta que caduque el token de Google.

Paso 7: (opcional) Propagar un token JWT a Runtime AgentCore

Si lo desea, puede pasar un encabezado de autorización a un AgentCore Runtime para extraer las reclamaciones. Esto se puede hacer mediante la configuración de lista de permisos del encabezado de solicitud. Para obtener más información, consulte RequestHeaderConfiguration.

Paso 7.1: Modifique el código de su agente para leer los encabezados

En este paso, realiza cambios en su código de agente para poder decodificar y extraer las reclamaciones de un token de JWT mediante la biblioteca PyJWT.

requirements.txt

Agrega la dependencia de PyJWT al archivo del proyecto generadorequirements.txt.

PyJWT

Actualice su código de agente

Modifique el archivo de agente principal del proyecto generado (normalmente src/main.py o similar, según el marco que elija) como se muestra en el código siguiente. Aquí puedes omitir la validación de la firma del token, ya que AgentCore Runtime ya la validó cuando se realizó la autorización de entrada.

import jwt import json .... @app.entrypoint def invoke(payload, context): auth_header = context.request_headers.get('Authorization') if not auth_header: return None # Remove "Bearer " prefix if present token = auth_header.replace('Bearer ', '') if auth_header.startswith('Bearer ') else auth_header try: # Skip signature validation as agent runtime has validated the token already. claims = jwt.decode(token, options={"verify_signature": False}) app.logger.info("Claims: %s", json.dumps(claims)) except jwt.InvalidTokenError as e: app.logger.exception("Invalid JWT token: %s", e) .....

Paso 7.2: Crea el agente con la lista de permitidos del encabezado de la solicitud

Utilice la AgentCore CLI para configurar el agente con la lista de permisos del encabezado de solicitud. Navegue hasta el directorio de proyectos generado y ejecute:

agentcore create --name HelloAgent --framework Strands --model-provider Bedrock --memory none # Now deploy the agent runtime agentcore deploy
nota

La AgentCore CLI crea la estructura del proyecto y los archivos de configuración. Ajuste la configuración del agente agentcore/agentcore.json según sea necesario para el marco que elija.

Paso 7.3: Invoca a tu agente

Invoca a tu agente mediante OAuth y verás las reclamaciones en los registros de tu agente. CloudWatch

Resolución de problemas

¿Cómo depurar problemas relacionados con los tokens

Si tienes problemas con la autenticación del token, puedes decodificarlo para inspeccionar su contenido:

echo "$TOKEN" | cut -d '.' -f2 | tr '_-' '/+' | awk '{ l=4 - length($0)%4; if (l<4) printf "%s", $0; for (i=0; i<l; i++) printf "="; print "" }' | base64 -D | jq

Esto generará la carga útil del token, que tiene un aspecto similar a:

{ "sub": "subid", "iss": "https://cognito-idp.us-east-1.amazonaws.com/userpoolid", "client_id": "clientid", "origin_jti": "originjti", "event_id": "eventid", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1752275688, "exp": 1752279288, "iat": 1752275688, "jti": "jti", "username": "username" }

Cuando resuelvas problemas con el token, comprueba lo siguiente:

  • La URL del emisor a la que apunta la URL de descubrimiento en el agente autorizador debe coincidir con la afirmación del emisor que figura en el token. Haga lo siguiente para confirmar que coinciden:

    • Seleccione la URL de descubrimiento que proporcionó en la configuración del autorizador cuando creó el agente, por ejemplo: https://cognito-idp.us-east-1.amazonaws.com/us-east-1_nnnnnnnnn/.well-known/openid-configuration

      • Compruebe la URL del emisor -. "issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_12345566" Debe coincidir con el valor declarado de ISS que figura en el token.

  • client_idLa afirmación del token debe coincidir con una de las entradas del autorizador (AllowedClients), si se proporciona

    • Anote el identificador de cliente que proporcionó al crear el agente

    • Confirma que coincide con la afirmación client_id del token decodificado

  • audLa afirmación del token debe coincidir con una de las entradas del autorizadorallowedAudience, si se proporciona

    • Anote la lista de audiencias que proporcionó al crear el agente

    • Confirma que coincide con la aud afirmación del token decodificado

  • Los tokens solo son válidos durante varios minutos (el plazo de caducidad predeterminado de Amazon Cognito es de 60 minutos). Obtenga un nuevo token según sea necesario.