View a markdown version of this page

Authentifiez-vous et autorisez avec Inbound Auth et Outbound Auth - Base rocheuse de l'Amazonie AgentCore

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Authentifiez-vous et autorisez avec Inbound Auth et Outbound Auth

Cette section explique comment implémenter l'authentification et l'autorisation pour l'exécution de votre agent à l'aide des jetons porteurs OAuth et JWT avec Identity. AgentCore Vous apprendrez à configurer des groupes d'utilisateurs Cognito, à configurer l'environnement d'exécution de votre agent pour l'authentification JWT (Inbound Auth) et à implémenter l' OAuth-based accès à des ressources tierces (Auth sortante).

Pour un exemple complet, voirhttps://github.com/awslabs/amazon-bedrock-agentcore-samples/.

Pour plus d'informations sur l'utilisation d'OAuth avec un serveur MCP, voir Déployer des serveurs MCP dans Runtime. AgentCore

L' AgentCore environnement d'exécution Amazon Bedrock fournit deux mécanismes d'authentification pour les agents hébergés :

Authentification IAM Sigv4

Le mécanisme d'authentification et d'autorisation par défaut qui fonctionne automatiquement sans configuration supplémentaire, comme les autres AWS API.

X-Amzn-Bedrock-AgentCore-Runtime-User-Id En-tête

Si votre solution nécessite que l'agent hébergé récupère les jetons OAuth pour le compte des utilisateurs finaux (à l'aide de l'attribution de code d'autorisation), vous pouvez spécifier l'identifiant de l'utilisateur en incluant l'X-Amzn-Bedrock-AgentCore-Runtime-User-Iden-tête dans vos demandes. Cet en-tête utilise le GetWorkloadAccessTokenForUserId chemin en interne.

Note

L'appel InvokeAgentRuntime avec le X-Amzn-Bedrock-AgentCore-Runtime-User-Id header will nécessitera une nouvelle action IAM :bedrock-agentcore:InvokeAgentRuntimeForUser, en plus de l'action existantebedrock-agentcore:InvokeAgentRuntime.

Quand utiliser cet en-tête par rapport à l'authentification JWT Bearer Token

Cet en-tête est conçu pour les cas d'utilisation suivants :

  • Entreprises clientes dotées d'identifiants utilisateur gérés par le client  : organisations qui gèrent leurs propres chaînes d'identité utilisateur et doivent les transmettre à Identity pour la liaison des informations AgentCore d'identification.

  • Scénarios de développement et de démarrage rapide  : créateurs qui ne disposent pas encore d'un jeton IdP et qui ont besoin d'un moyen rapide de tester les flux d'informations d'identification à l'échelle de l'utilisateur.

    Pour les déploiements de production dans lesquels un fournisseur d'identité est configuré, utilisez plutôt l'authentification JWT Bearer Token. Le chemin JWT (GetWorkloadAccessTokenForJWT) valide l'émetteur, la signature et l'expiration du jeton, fournissant une preuve cryptographique de l'identité de l'utilisateur. Le chemin X-Amzn-Bedrock-AgentCore-Runtime-User-Id d'en-tête ne vérifie pas l'ID utilisateur par rapport à une identité d'utilisateur final authentifiée. Il dépend de la charge de travail de l'appelant pour transmettre la valeur correcte et de vos politiques IAM pour restreindre les personnes autorisées à la fournir.

    Meilleures pratiques de sécurité pour X-Amzn-Bedrock-AgentCore-Runtime-User-Id Header

    Astuce

    Pour une vue consolidée de toutes les recommandations de sécurité relatives à Runtime, consultez la section Bonnes pratiques en matière de sécurité pour AgentCore Runtime.

    Étant donné AgentCore que la valeur d'en-tête est traitée comme un identifiant opaque sans la vérifier par rapport à une identité authentifiée, vous devez appliquer les contrôles suivants pour maintenir la limite de sécurité :

  • Restreindre l'autorisation IAM  : seuls les principaux responsables de confiance doivent disposer de cette autorisation. bedrock-agentcore:InvokeAgentRuntimeForUser Étendez cette autorisation à des ressources d'exécution spécifiques à l'aide des conditions de ressources IAM. Ne l'accordez pas de manière générale par le biais de politiques gérées ou d'instructions de ressources génériques.

  • Dériver l'identifiant utilisateur à partir du principal authentifié — La valeur de l'identifiant utilisateur doit être dérivée du contexte du principal authentifié (par exemple, identité de l'appelant IAM ou revendications de jeton utilisateur) plutôt que d'accepter des valeurs arbitraires fournies par le client. Cela empêche un utilisateur authentifié de se faire passer pour un autre utilisateur en spécifiant manuellement un autre utilisateur. user-id

  • Implémentez la journalisation des audits  : enregistrez la relation entre le principal IAM authentifié (à partir du contexte SIGv4) et la user-id valeur transmise. Permet AWS CloudTrail de surveiller InvokeAgentRuntime les appels qui incluent le runtimeUserId paramètre.

  • Refuser l'en-tête dans des contextes non fiables — Pour les environnements d'exécution où la délégation de l'identifiant utilisateur n'est pas nécessaire, refusez explicitement l'bedrock-agentcore:InvokeAgentRuntimeForUseraction dans les politiques IAM pour empêcher l'acceptation de l'en-tête :

    { "Statement": [ { "Sid": "DenyUserIdDelegation", "Effect": "Deny", "Action": "bedrock-agentcore:InvokeAgentRuntimeForUser", "Resource": "arn:aws:bedrock-agentcore:REGION:ACCOUNT_ID:runtime/*" } ] }
Authentification par jeton JWT Bearer

Vous pouvez configurer l'environnement d'exécution de votre agent pour qu'il accepte les jetons JWT bearer en fournissant la configuration de l'autorisateur lors de la création de l'agent.

Cette configuration inclut :

  • URL de découverte : chaîne qui doit correspondre au modèle des URL ^.+/\.well-known/openid-configuration$ de découverte d'OpenID Connect

  • Audiences autorisées : liste des audiences autorisées qui seront validées par rapport à la valeur aud indiquée dans le jeton JWT

  • Clients autorisés - Une liste d'identifiants de clients autorisés qui seront validés par rapport à la réclamation client_id dans le jeton JWT

  • Étendues autorisées : liste des étendues autorisées qui seront validées par rapport à la portée revendiquée dans le jeton JWT. Le champ allowedScopes d'autorisation sera configuré sous la forme d'une liste de chaînes.

  • Réclamations personnalisées requises : liste des revendications requises qui seront validées par rapport au nom et à la valeur de la réclamation contenus dans le jeton JWT entrant. Pour plus de détails sur la configuration de l'autorisateur, voir Configurer l'autorisateur JWT entrant

Note

Un AgentCore environnement d'exécution peut prendre en charge l'authentification entrante basée sur IAM Sigv4 ou JWT Bearer Token, mais pas les deux simultanément. Vous pouvez toujours créer différentes versions de votre AgentCore environnement d'exécution et les configurer pour différents types d'autorisations entrantes. Lorsque vous créez un environnement d'exécution avec Amazon Bedrock AgentCore, une identité de charge de travail est créée automatiquement pour votre environnement d'exécution avec le service AgentCore Identity.

Restreindre les appels entrants IAM (Sigv4) à votre passerelle

Vous pouvez intégrer une AgentCore passerelle à votre AgentCore environnement d'exécution afin que celle-ci devienne le point d'entrée unique et régi du runtime, ce qui vous donne accès à une autorisation basée sur des règles, à Amazon Bedrock Guardrails, à des intercepteurs de demandes et de réponses et à une observabilité unifiée, le tout appliqué en dehors de l'environnement de l'agent. Pour en savoir plus sur la justification complète et sur la manière de configurer cela, consultez la section Intégrez votre environnement d'exécution à l'aide d'une AgentCore passerelle.

Mais cela n'est utile que si les appelants ne peuvent pas accéder directement au runtime en contournant la passerelle. Si votre environnement d'exécution utilise l'autorisation entrante IAM (Sigv4) par défaut, vous pouvez restreindre l'appel à la passerelle afin que le trafic n'atteigne le moteur d'exécution que par son intermédiaire. Pour ce faire, associez au runtime une politique basée sur les ressources qui limite l'invocation au rôle d'exécution de votre passerelle. La passerelle assume son rôle de service pour signer les demandes adressées au moteur d'exécution. Le rôle de passerelle est donc le principal qui invoque le moteur d'exécution. Autorisez ce rôle et ajoutez un rôle explicite Deny pour tous les autres principaux afin qu'aucune autre identité ne puisse invoquer le runtime, même avec une politique permissive basée sur l'identité. Pour plus d'informations sur les politiques d'exécution basées sur les ressources, consultez les politiques Resource-based relatives à Amazon 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" } } } ] }
Astuce

Une politique explicite l'emporte Deny toujours sur toutes les politiquesAllow, y compris celles basées sur l'identité pour le même compte. Si vous Deny activezaws:PrincipalArn, seul le rôle d'exécution de votre passerelle peut invoquer le runtime, quelles que soient les autres autorisations disponibles sur votre compte.

Important

Restreindre le runtime au rôle d'exécution de la passerelle n'est efficace que si l'on contrôle qui peut assumer ce rôle. Tout principal pouvant assumer le rôle d'exécution de la passerelle peut invoquer le runtime comme s'il s'agissait de la passerelle. Verrouillez le rôle en ajoutant aws:SourceArn des aws:SourceAccount conditions à la politique de confiance du rôle d'exécution de la passerelle afin que seule votre passerelle puisse l'assumer. Le guide de prévention Confused Deputy présente la même technique que celle appliquée au rôle d'exécution d'un environnement d'exécution ; appliquez le même schéma ici, mais définissez la politique de confiance sur le rôle et la portée aws:SourceArn d'exécution de la passerelle sur l'ARN de votre passerelle.

Exemple d'autorisation entrante JWT et d'accès sortant OAuth

Ce guide explique le processus de configuration de l'environnement d'exécution de votre agent pour qu'il soit invoqué avec un jeton d'accès conforme à OAuth au format JWT. L'agent d'échantillonnage sera autorisé à l'aide de jetons d'accès AWS Cognito. Plus tard, vous découvrirez également comment le code d'agent peut récupérer des jetons Google pour le compte de l'utilisateur afin qu'il consulte Google Drive et récupère le contenu.

Ce que tu vas apprendre

Dans ce guide, vous allez apprendre à :

  • Configurez le groupe d'utilisateurs Cognito, ajoutez un utilisateur et obtenez un jeton porteur pour cet utilisateur

  • Configurez l'environnement d'exécution de votre agent pour utiliser le groupe d'utilisateurs Cognito à des fins d'autorisation

  • Configurez votre code d'agent pour récupérer les jetons OAuth au nom de l'utilisateur pour appeler les outils

Conditions préalables

Avant de commencer, assurez-vous d'avoir :

  • Un AWS compte avec les autorisations appropriées

  • Compréhension de base de la programmation Python

  • Connaissance des conteneurs Docker (pour un déploiement avancé)

  • Configuration réussie d'un agent de base avec runtime

  • La dernière AWS CLI et jq installée

  • Compréhension de base de l'autorisation OAuth, principalement des jetons porteurs JWT, des réclamations et des différents flux de subventions

Étape 1 : Créez votre projet d'agent

Utilisez la agentcore create commande pour configurer un projet vide. Vous ajoutez l' JWT-authorized agent après avoir créé les ressources Cognito à l'étape 2.

agentcore create --project-name OAuthAgentProject --no-agent cd OAuthAgentProject

Cette commande génère :

  • Fichier de configuration agentcore/agentcore.json

  • agentcore/aws-targets.jsonfichier cible de déploiement

  • agentcore/cdk/projet d'infrastructure

Note

Conservez ce terminal OAuthAgentProject pour les commandes AgentCore CLI restantes.

Étape 2 : Configuration AWS Groupe d'utilisateurs Cognito et ajout d'un utilisateur

Pour configurer un groupe d'utilisateurs Cognito et créer un utilisateur, vous allez utiliser un script shell qui automatise le processus.

Pour plus d'informations, consultez Étape 2 : Importer les modules Identity et Auth.

Pour configurer le groupe d'utilisateurs Cognito et créer un utilisateur

  • Créez un fichier nommé setup_cognito.sh avec le contenu suivant:

    #!/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"

    Ouvrez une fenêtre de terminal et définissez les variables d'environnement suivantes :

    • REGION— la AWS région que vous souhaitez utiliser

    • USERNAME— le nom d'utilisateur du nouvel utilisateur

    • PASSWORD— le mot de passe du nouvel utilisateur

      export REGION=us-east-1 # Set your desired Region export USERNAME="user-name" export PASSWORD="password"

      Dans la fenêtre du terminal, exécutez le script :

      source setup_cognito.sh

      Notez le résultat du script. Vous aurez besoin de ces valeurs pour les prochaines étapes.

Ce script crée un groupe d'utilisateurs Cognito, un client de groupe d'utilisateurs, ajoute un utilisateur et génère un jeton porteur pour cet utilisateur. Le jeton est valide pendant 60 minutes par défaut.

Étape 3 (Facultatif) : configurez votre environnement d'exécution avec une AgentCore passerelle

Vous pouvez intégrer une AgentCore passerelle à votre AgentCore environnement d'exécution afin que celle-ci devienne le point d'entrée unique et régi du runtime, ce qui vous donne accès à une autorisation basée sur des règles, à Amazon Bedrock Guardrails, à des intercepteurs de demandes et de réponses et à une observabilité unifiée, le tout appliqué en dehors de l'environnement de l'agent. Pour en savoir plus sur la justification complète et sur la manière de configurer cela, consultez la section Intégrez votre environnement d'exécution à l'aide d'une AgentCore passerelle.

Si vous souhaitez lancer ce runtime, créez la passerelle dès maintenant, avant de déployer le runtime à l'étape suivante. Après le déploiement, vous allez ajouter le runtime en tant que cible de passerelle.

Pour vous assurer que les appelants ne peuvent pas contourner la passerelle, limitez le runtime pour qu'il n'accepte que les appels provenant de cette passerelle. Utilisez allowedWorkloadConfiguration comme décrit dans Autorisé WorkloadConfiguration : limitez l'invocation à votre passerelle. La AgentCore CLI ne configure pas ce champ. Utilisez l'API du AgentCore plan de contrôle.

Étape 4 : Déployez votre agent

Important

À compter du 13 octobre 2025, Amazon Bedrock AgentCore utilise un Service-Linked rôle (SLR) pour les autorisations d'identité de la charge de travail au lieu d'exiger la configuration manuelle des politiques IAM pour les nouveaux agents.

Détails du Service-Linked rôle :

  • Nom: AWSServiceRoleForBedrockAgentCoreRuntimeIdentity

  • Directeur du service : runtime-identity.bedrock-agentcore.amazonaws.com

  • Objectif : Gère l'identité de la charge de travail, les jetons d'accès et les informations d'identification OAuth

Assurez-vous que le rôle que vous utilisez pour appeler les API AgentCore de contrôle est autorisé à créer le Service-Linked rôle :

{ "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" } } }

Avantage  : Le Service-Linked rôle fournit automatiquement les autorisations nécessaires pour accéder à l'identité de la charge de travail sans nécessiter de configuration manuelle des politiques.

Pour plus d'informations sur le rôle lié à un service, voir Rôle lié à un service d'identité.

Vous allez maintenant déployer votre agent avec l'autorisation JWT à l'aide du groupe d'utilisateurs Cognito que vous avez créé. Vous devrez créer un agent avec une configuration d'autorisation. Le tableau suivant représente les différents paramètres de configuration de l'autorisateur et la manière dont nous les utilisons pour valider le jeton entrant.

configuration_de l'autorisateur réclamation sous forme de jeton décodé Remarques

url de découverte → émetteur

bise

L'URL de découverte doit pointer vers l'URL de l'émetteur. Cela devrait correspondre à la déclaration iss figurant dans le jeton décodé.

Clients autorisés

client_id

client_id dans le jeton doit correspondre à l'un des clients autorisés spécifiés dans l'autorisateur

Public autorisé

aud

L'une des valeurs en aud claim du jeton doit correspondre à l'une des audiences autorisées spécifiées dans l'autorisateur

autorisé WorkloadConfiguration

internal

Facultatif. Au lancement, utilisé pour autoriser uniquement votre AgentCore passerelle à invoquer le runtime. Consultez la section Restreindre l'invocation à votre passerelle.

Si client_id et aud sont tous deux fournis, l'autorisateur d'exécution de l'agent vérifiera les deux.

autorisé WorkloadConfiguration : limitez l'invocation à votre passerelle

Le allowedWorkloadConfiguration champ sur les customJWTAuthorizer limites des charges de travail de la chaîne d'identité de la demande qui sont autorisées à invoquer le runtime. Définissez la charge de travail autorisée pour votre passerelle afin que le moteur d'exécution n'accepte une demande que lorsque sa chaîne d'identité inclut cette passerelle. C'est ainsi qu'un environnement d'exécution OAuth (JWT) fait en sorte que le trafic n'arrive que via la passerelle que vous avez configurée à l'étape 3.

Vous indiquez les charges de travail autorisées à l'aide de l'un des champs suivants. Vous pouvez spécifier l'un ou les deux : une demande est acceptée si sa chaîne d'identité correspond à une entrée dans l'un ou l'autre des champs. Vous n'avez donc pas besoin de fournir les deux.

  • HostingEnvironments  : liste des environnements d'hébergement dont les charges de travail sont autorisées à invoquer la cible. Chaque entrée est un objet avec unarn. Au lancement, le seul environnement d'hébergement pris en charge est AgentCore Gateway. Chacun arn doit donc être un ARN AgentCore Gateway.

  • WorkloadIdentities  : liste des noms d'identité de charge de travail autorisés à invoquer la cible. Le nom d'identité d'une charge de travail n'est pas un ARN. Il s'agit du dernier segment de l'ARN d'identité de charge de travail de la passerelle, que vous pouvez trouver dans le workloadIdentityDetails champ de GetGateway réponse. Par exemple, si workloadIdentityDetails.workloadIdentityArn c'est le casarn:aws:bedrock-agentcore:us-east-1:111122223333:workload-identity-directory/default/workload-identity/my-gateway-workload-identity, le nom d'identité de la charge de travail estmy-gateway-workload-identity.

La configuration d'autorisation suivante limite l'appel à une AgentCore passerelle spécifique par son ARN. La spécification hostingEnvironments seule est la méthode la plus simple pour autoriser une passerelle :

{ "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" } ] } } } }

Vous pouvez également identifier la passerelle par le nom d'identité de sa charge de travail ou spécifier les deux champs. Lorsque les deux sont présents, une demande est autorisée si elle correspond à une entrée dans l'un ou l'autre des champs. L'allowedWorkloadConfigurationextrait suivant autorise deux passerelles différentes, l'une identifiée par son ARN et l'autre par le nom d'identité de sa charge de travail :

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

Au lancement, n'allowedWorkloadConfigurationest pris en charge que pour les cibles AgentCore Runtime, et les charges de travail autorisées sont les AgentCore passerelles.

Création et déploiement de l'environnement d'exécution de l'agent

Une fois la configuration de votre autorisateur prête, créez et déployez l'environnement d'exécution de l'agent. Les exemples suivants montrent comment procéder à l'aide de l' AgentCore interface de ligne de commande ou du AWS SDK pour Python (Boto3). Notez l'ARN d'exécution de l'agent figurant sur la sortie. Vous en aurez besoin pour appeler l'agent à l'étape suivante.

Exemple
AgentCore CLI

Pour configurer et déployer votre agent

  1. Ajoutez l'agent au projet que vous avez créé à l'étape 1. La commande configure l'URL de découverte de Cognito, l'ID client et la liste d'autorisations d'en-tête de Authorization demande :

    agentcore add agent \ --name OAuthAgent \ --language Python \ --framework Strands \ --model-provider Bedrock \ --memory none \ --authorizer-type CUSTOM_JWT \ --discovery-url "https://cognito-idp.$REGION.amazonaws.com/$POOL_ID/.well-known/openid-configuration" \ --allowed-clients "$CLIENT_ID" \ --request-header-allowlist Authorization
  2. Déployez votre agent :

    agentcore deploy
  3. Notez l'ARN d'exécution de l'agent figurant sur la sortie. Vous en aurez besoin à l'étape suivante.

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 }, )
Note

L'exemple AgentCore CLI configure l'autorisation JWT, mais il ne le fait pas. allowedWorkloadConfiguration Si vous présentez une passerelle au moteur d'exécution, utilisez l'API du AgentCore plan de contrôle pour ajouter ce champ.

Étape 5 : Utilisez le jeton du porteur pour invoquer votre agent

Maintenant que votre agent est déployé avec l'autorisation JWT, vous pouvez l'invoquer à l'aide du jeton porteur.

Note

Si vous avez connecté votre environnement d'exécution à une passerelle à l'étape 3, ajoutez le moteur d'exécution déployé en tant que cible de passerelle avant d'invoquer (voir Cibles AgentCore d'exécution), puis invoquez via le point de terminaison de la passerelle illustré dans les exemples suivants, plutôt que via le point de terminaison d'exécution.

Important

Important pour les utilisateurs existants  : les agents créés avant le 13 octobre 2025 continueront à utiliser le rôle d'exécution d'agent pour les autorisations d'identité et nécessiteront que la politique précédente soit associée au rôle d'exécution de l'agent.

Nouveaux agents  : pour les agents créés le 13 octobre 2025 ou après cette date, cette politique n'est pas requise car les autorisations sont gérées automatiquement par le Service-Linked rôle.

{ "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-*" ] }

Invoquer l'agent

Récupérez un jeton porteur pour l'utilisateur que vous avez créé avec 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')

Passez à l'appel de l'agent en suivant le reste des instructions suivantes.

Invoquez l'agent avec OAuth.

Exemple
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. Comme boto3 ne prend pas en charge l'invocation avec des jetons porteurs, vous devrez utiliser un client HTTP comme la bibliothèque de requêtes en Python.

    Pour invoquer votre agent avec un jeton au porteur

  2. Créez un script Python nommé invoke_agent.py avec le contenu suivant :

    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. Remplacez AWS_REGION par la AWS région que vous utilisez. à partir de l'étape 3.

  4. Remplacez-le YOUR_AGENT_ARN_HERE par l'ARN d'exécution de votre agent actuel à l'étape 3.

  5. Exécutez le script  :

    python invoke_agent.py

Réponses aux erreurs OAuth

OAuth-configured les agents suivent les normes d'authentification RFC 6749 (OAuth 2.0). Lorsque l'authentification est manquante, le service renvoie une réponse 401 Unauthorized avec un WWW-Authenticate en-tête (conformément à la RFC 7235), permettant aux clients de découvrir les points de terminaison du serveur d'autorisation via l'API. GetRuntimeProtectedResourceMetadata

401 Non autorisé - Authentification manquante

Lorsqu'aucun jeton Bearer n'est fourni dans l'en-tête Authorization, la réponse est la suivante :

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}"

L'resource_metadataURL de l' WWW-Authenticate en-tête pointe vers l'API PRM (Protected Resource Metadata). L'API PRM permet aux clients de découvrir quels serveurs d'autorisation protègent cet agent et leurs URL de point de terminaison OAuth.

Note

Vous devez pré-enregistrer votre client OAuth dans Cognito (via la AWS console ou l'interface de ligne de commande) pour obtenir un client_id avant d'utiliser les points de terminaison découverts. Amazon Cognito ne prend pas en charge l'enregistrement dynamique des clients (RFC 7591).

Étape 6 : configurer votre agent pour qu'il accède aux outils à l'aide d'OAuth

Dans cette section, vous allez apprendre à connecter votre code d'agent aux fournisseurs AgentCore d'informations d'identification pour un accès sécurisé à des ressources externes à l'aide de l'authentification OAuth2.

L'exemple suivant montre comment votre agent qui s'exécute dans Agent Runtime peut demander le consentement OAuth aux utilisateurs, leur permettant ainsi de s'authentifier avec leur compte Google et d'autoriser l'agent à accéder à leur contenu Google Drive.

Pour plus d'informations sur la configuration de l'identité, voir Commencer à utiliser AgentCore l'identité.

Étape 6.1 : Configuration des fournisseurs d'informations d'identification

Pour configurer un fournisseur d'informations d'identification Google, vous devez :

  1. Enregistrez votre application auprès de Google pour obtenir l'identifiant et le secret du client

  2. Créez un fournisseur d'informations d'identification OAuth à l'aide de l'interface de ligne de commande. AWS Remplacez your-client-id et your-client-secret par votre identifiant client Google OAuth2 et votre code secret client actuels :

    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"
    Note

    Obtenez le résultat callbackUrl de la CreateOauth2CredentialProvider réponse et ajoutez l'URI à la liste des URI de redirection de votre application Google. L'URL de rappel doit ressembler à : https://bedrock-agentcore.us-east-1.amazonaws.com/identities/oauth2/callback/ ********-****-****-****-************

Assurez-vous que votre rôle d'invocation dispose des autorisations nécessaires pour accéder au fournisseur d'informations d'identification.

Étape 6.2 : Autoriser l'agent à lire le contenu de Google Drive

Créez un outil avec les annotations du SDK principal de l'agent, comme illustré dans l'exemple suivant, pour lancer automatiquement le processus OAuth en trois étapes. Lorsque votre agent invoque cet outil, les utilisateurs sont invités à ouvrir l'URL d'autorisation dans leur navigateur et à autoriser l'agent à accéder à leur 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=""))
Note

Pour un exemple d'implémentation de serveur de rappel local permettant de gérer la liaison de session, reportez-vous à oauth2_callback_server.py sur GitHub

Que se passe-t-il dans les coulisses

Lorsque ce code s'exécute, le processus suivant se produit :

  1. Agent Runtime autorise le jeton entrant en fonction de l'autorisateur configuré.

  2. Agent Runtime échange ce jeton contre un jeton d'accès à la charge de travail via une bedrock-agentcore:GetWorkloadAccessTokenForJWT API et le transmet au code de votre agent via l'en-tête WorkloadAccessToken de charge utile.

  3. Lors de l'appel à l'outil, votre agent utilise ce jeton d'accès à la charge de travail pour appeler l'API Token Vault bedrock-agentcore:GetResourceOauth2Token et générer une URL d'authentification 3LO.

  4. Votre agent envoie cette URL à l'application cliente comme indiqué dans la on_auth_url méthode.

  5. L'application cliente présente cette URL à l'utilisateur, qui autorise l'agent à accéder à son Google Drive.

  6. AgentCore Le service d'identité reçoit et met en cache en toute sécurité le jeton d'accès Google jusqu'à son expiration, ce qui permet à l'utilisateur de demander ultérieurement l'utilisation de ce jeton sans avoir à donner son consentement pour chaque demande.

Note

AgentCore Identity Service stocke le jeton d'accès Google dans le Token Vault AgentCore en utilisant l'identité de la charge de travail de l'agent et l'ID utilisateur (provenant du jeton JWT entrant, tel que le jeton AWS Cognito) comme clé de liaison, éliminant ainsi les demandes de consentement répétées jusqu'à l'expiration du jeton Google.

Étape 7 : (Facultatif) Propager un jeton JWT vers Runtime AgentCore

Vous pouvez éventuellement transmettre un en-tête Authorization à un AgentCore Runtime pour extraire les revendications. Cela peut être fait en utilisant la configuration de la liste d'autorisations de l'en-tête de demande. Pour de plus amples informations, veuillez consulter RequestHeaderConfiguration.

Étape 7.1 : modifiez le code de votre agent pour lire les en-têtes

Au cours de cette étape, vous apportez des modifications au code de votre agent afin de pouvoir décoder et extraire les revendications d'un jeton JWT à l'aide de la bibliothèque PyJWT.

Dépendances Python

Ajoutez PyJWT à l'agent généré : pyproject.toml

cd app/OAuthAgent uv add PyJWT cd ../..

Mettez à jour votre code d'agent

Modifiez app/OAuthAgent/main.py comme indiqué dans le code suivant. Vous pouvez ignorer la validation de la signature du jeton ici car AgentCore Runtime a déjà validé le jeton lors de l'autorisation entrante.

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) .....

Étape 7.2 : Déploiement de l'agent mis à jour

La agentcore add agent commande de l'étape 4 a déjà configuré la liste d'autorisation des en-têtes de Authorization demande. Déployez la mise à jour du code :

agentcore deploy

Étape 7.3 : Invoquer votre agent

Invoquez votre agent à l'aide d'OAuth et vous devriez voir les réclamations dans les journaux de votre agent. CloudWatch

Résolution des problèmes

Comment résoudre les problèmes liés aux jetons

Si vous rencontrez des problèmes d'authentification par jeton, vous pouvez décoder le jeton pour inspecter son contenu :

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

Cela produira la charge utile du jeton, qui ressemble à :

{ "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" }

Lorsque vous résolvez des problèmes liés aux jetons, vérifiez les points suivants :

  • L'URL de l'émetteur pointée par l'URL de découverte dans l'autorisation de l'agent doit correspondre à la déclaration de l'émetteur figurant sur le jeton. Procédez comme suit pour confirmer qu'ils correspondent :

    • Sélectionnez l'URL de découverte que vous avez fournie dans la configuration de l'autorisateur lorsque vous avez créé l'agent, par exemple : https://cognito-idp.us-east-1.amazonaws.com/us-east-1_nnnnnnnnn/.well-known/openid-configuration

      • Vérifiez l'URL de l'émetteur -"issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_12345566". Cela devrait correspondre à la valeur déclarée de l'iss dans le jeton.

  • client_idla réclamation du jeton doit correspondre à l'une des entrées de l'autorisateur AllowedClients, si elle est fournie

    • Notez l'identifiant client que vous avez fourni lors de la création de l'agent

    • Vérifiez que cela correspond à la réclamation client_id dans le jeton décodé

  • audla réclamation figurant dans le jeton doit correspondre à l'une des allowedAudience entrées de l'autorisation, si elle est fournie

    • Notez la liste d'audience que vous avez fournie lors de la création de l'agent

    • Vérifiez que cela correspond à l'audaffirmation du jeton décodé

  • Les jetons ne sont valides que pendant quelques minutes (l'expiration par défaut d'Amazon Cognito est de 60 minutes). Récupérez un nouveau jeton si nécessaire.