Authentifier et autoriser avec l'authentification entrante et l'authentification sortante
Cette section explique comment implémenter l'authentification et l'autorisation pour le runtime de votre agent à l'aide de jetons porteurs OAuth et JWT avec Identity. AgentCore Vous apprendrez à configurer des groupes d'utilisateurs de Cognito, à configurer le runtime de votre agent pour l'authentification JWT (Inbound Auth) et à implémenter l' OAuth-based accès à des ressources tierces (Outbound Auth).
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
Amazon Bedrock AgentCore Runtime 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 (en utilisant le code d'autorisation Grant), 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 leGetWorkloadAccessTokenForUserIdchemin en interne.Note
L'invocation InvokeAgentRuntime avec le
X-Amzn-Bedrock-AgentCore-Runtime-User-Id headerné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 dont les identifiants utilisateur sont 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 pour tester des flux d'informations d'identification adaptés à l'utilisateur.
Pour les déploiements de production où 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 cheminX-Amzn-Bedrock-AgentCore-Runtime-User-Idd'en-tête ne vérifie pas l'UserID par rapport à l'identité authentifiée de l'utilisateur final. Il dépend de la charge de travail des appels pour transmettre la valeur correcte et de vos politiques IAM pour limiter les personnes autorisées à la fournir.Bonnes pratiques de sécurité pour les X-Amzn-Bedrock-AgentCore-Runtime-User-Id en-têtes
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 fiables doivent avoir 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 de déclarations de ressources génériques. -
Dériver l'identifiant utilisateur du principal authentifié — La valeur de l'identifiant utilisateur doit être dérivée du contexte du principal authentifié (par exemple, l'identité de l'appelant IAM ou les demandes de jeton d'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émenter la journalisation des audits : enregistrez la relation entre le principal IAM authentifié (à partir du contexte SigV4) et la
user-idvaleur transmise. AWS CloudTrail À utiliser pour surveillerInvokeAgentRuntimeles appels qui incluent leruntimeUserIdparamètre. -
Refuser l'en-tête dans des contextes non fiables : pour les environnements d'exécution où la délégation d'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 le runtime de votre agent pour qu'il accepte les jetons porteurs JWT 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 réclamation AUD contenue dans le jeton JWT
-
Clients autorisés : liste des identifiants clients autorisés qui seront validés par rapport à la réclamation client_id dans le jeton JWT
-
Portées autorisées : liste des étendues autorisées qui seront validées par rapport à la réclamation de portée contenue dans le jeton JWT. Le champ
allowedScopesd'autorisation sera configuré sous la forme d'une liste de chaînes. -
Réclamations personnalisées requises - Liste des réclamations 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 Runtime 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 Runtime 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.
Rubriques
Exemple d'autorisation entrante JWT et d'accès sortant OAuth
Étape 2 : Configuration AWS Groupe d'utilisateurs Cognito et ajout d'un utilisateur
Étape 3 (facultatif) : présentez votre environnement d'exécution à l'aide d'une AgentCore passerelle
Étape 5 : utilisez le jeton porteur pour invoquer votre agent
Étape 6 : configurer votre agent pour accéder aux outils à l'aide d'OAuth
Étape 7 : (Facultatif) Propagation d'un jeton JWT vers Runtime AgentCore
Limitez les appels entrants IAM (SigV4) à votre passerelle
Vous pouvez équiper votre AgentCore environnement d'exécution d'une AgentCore passerelle afin que celle-ci devienne le point d'entrée unique et régi vers l'environnement d'exécution. Vous bénéficiez ainsi d'une autorisation basée sur des règles, d'Amazon Bedrock Guardrails, d'intercepteurs de requêtes et de réponses et d'une observabilité unifiée, le tout appliqué en dehors de l'environnement de l'agent. Pour en savoir plus sur les raisons et sur la manière de le configurer, voir Façonner votre environnement d'exécution avec une AgentCore passerelle.
Mais cela n'est utile que si les appelants ne peuvent pas atteindre le moteur d'exécution en contournant directement la passerelle. Si votre environnement d'exécution utilise l'autorisation entrante IAM (SigV4) par défaut, vous pouvez limiter l'appel à la passerelle afin que le trafic atteigne le moteur d'exécution uniquement par son intermédiaire. Pour ce faire, associez à l'environnement d'exécution 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 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 basées sur les ressources applicables aux environnements d'exécution, consultez les politiques d'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" } } } ] }
Astuce
Un explicite l'emporte Deny toujours sur toutAllow, y compris les politiques basées sur l'identité dans le même compte. Lorsque vous appuyez Deny sur aws:PrincipalArn Activé, seul le rôle d'exécution de votre passerelle peut invoquer le runtime, quelles que soient les autres autorisations existantes sur votre compte.
Important
Restreindre l'environnement d'exécution au rôle d'exécution de la passerelle est aussi efficace que les contrôles permettant de déterminer qui peut assumer ce rôle. Tout principal pouvant assumer le rôle d'exécution de passerelle peut invoquer le moteur d'exécution 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 de Confused deputy montre la même technique 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 concernant le rôle d'exécution de la passerelle et l'étendue aws:SourceArn de 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 témoin sera autorisé à l'aide des jetons d'accès AWS Cognito. Plus tard, vous découvrirez également comment le code de l'agent peut récupérer des jetons Google au nom de l'utilisateur pour vérifier Google Drive et récupérer du contenu.
Ce que vous allez apprendre
Dans ce guide, vous allez apprendre à :
-
Configuration du groupe d'utilisateurs de Cognito, ajout d'un utilisateur et obtention d'un jeton porteur pour l'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 exécution
-
La dernière AWS CLI et
jqinstallé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 d'agent squelette avec le framework de votre choix :
agentcore create
La commande vous demandera de :
-
Choisissez un framework (choisissez Strands Agents pour ce tutoriel)
-
Entrez un nom de projet
-
Configuration d’options supplémentaires
Cette commande génère :
-
Code d'agent avec le framework que vous avez sélectionné
-
Fichier de configuration
agentcore/agentcore.json -
requirements.txtavec les dépendances nécessaires
Note
Le code d'agent généré servira de base à la mise en œuvre de l'authentification OAuth dans les étapes suivantes.
É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, voir Étape 2 : Importer les modules Identity et Auth.
Pour configurer le groupe d'utilisateurs de Cognito et créer un utilisateur
-
Créez un fichier nommé
setup_cognito.shavec 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 utilisateurexport REGION=us-east-1 // set your desired Region export USERNAME=USER NAME export PASSWORD=PASSWORDDans la fenêtre du terminal, exécutez le script :
source setup_cognito.shNotez le résultat du script. Vous aurez besoin de ces valeurs dans 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 l'utilisateur. Le jeton est valide pendant 60 minutes par défaut.
Étape 3 (facultatif) : présentez votre environnement d'exécution à l'aide d'une AgentCore passerelle
Vous pouvez équiper votre AgentCore environnement d'exécution d'une AgentCore passerelle afin que celle-ci devienne le point d'entrée unique et régi vers l'environnement d'exécution. Vous bénéficiez ainsi d'une autorisation basée sur des règles, d'Amazon Bedrock Guardrails, d'intercepteurs de requêtes et de réponses et d'une observabilité unifiée, le tout appliqué en dehors de l'environnement de l'agent. Pour en savoir plus sur les raisons et sur la manière de le configurer, voir Façonner votre environnement d'exécution avec une AgentCore passerelle.
Si vous souhaitez créer cet environnement d'exécution, créez la passerelle dès maintenant, avant de déployer le moteur d'exécution à l'étape suivante. Après le déploiement, vous ajouterez le runtime en tant que cible de passerelle.
Pour vous assurer que les appelants ne peuvent pas contourner la passerelle, limitez le temps d'exécution afin qu'il n'accepte que les appels provenant de cette passerelle. Vous le configurez à l'étape suivante, dans le cadre de l'autorisateur, en utilisant allowedWorkloadConfiguration (voir autorisé WorkloadConfiguration : restreindre l'invocation à votre passerelle).
É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é des charges 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 de AgentCore 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 des informations détaillées sur le rôle lié au service, consultez la section Rôle lié au service Identity.
Vous allez maintenant déployer votre agent avec l'autorisation JWT en utilisant le groupe d'utilisateurs Cognito que vous avez créé. Vous devez 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_autorisation | réclamation sous forme de jeton décodé | Remarques |
|---|---|---|
|
URL de découverte → émetteur |
iss |
L'URL de découverte doit pointer vers l'URL de l'émetteur. Cela doit correspondre à la réclamation iss dans le jeton décodé. |
|
Clients autorisés |
client_id |
le 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 dollars australiens réclamées par le jeton doit correspondre à l'une des audiences autorisées spécifiées dans l'autorisateur |
|
autorisé WorkloadConfiguration |
|
Facultatif. Au lancement, utilisé pour autoriser uniquement votre AgentCore passerelle à appeler le runtime. Consultez Restreindre l'invocation à votre passerelle. |
Si client_id et aud sont fournis, l'autorisateur d'exécution de l'agent vérifiera les deux.
autorisé WorkloadConfiguration : limitez l'invocation à votre passerelle
Le allowedWorkloadConfiguration champ relatif au customJWTAuthorizer restreint les charges de travail de la chaîne d'identité de la demande autorisées à invoquer le runtime. Définissez la charge de travail autorisée pour votre passerelle afin que le moteur d'exécution accepte une demande uniquement lorsque sa chaîne d'identité inclut cette passerelle. C'est ainsi qu'un environnement d'exécution OAuth (JWT) garantit 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 en spécifier 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 un
arn. Au lancement, le seul environnement d'hébergement pris en charge est AgentCore Gateway. Chaque environnementarndoit donc être un AgentCore Gateway ARN. -
workloadIdentities — Liste des noms d'identité de charge de travail autorisés à appeler 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
workloadIdentityDetailschamp deGetGatewayréponse. Par exemple, si telworkloadIdentityDetails.workloadIdentityArnest le casarn:aws:bedrock-agentcore:us-east-1:111122223333:workload-identity-directory/default/workload-identity/my-gateway-workload-identity, le nom de l'identité de la charge de travail estmy-gateway-workload-identity.
L'exemple suivant crée un environnement d'exécution d'agent qui restreint l'invocation à une AgentCore passerelle spécifique par son ARN. La spécification hostingEnvironments seule est le moyen le plus simple d'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 son nom d'identité de 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 de son identité de 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 d'exécution, 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 le runtime de l'agent. Les exemples suivants montrent comment procéder avec la AgentCore CLI ou le AWS SDK pour Python (Boto3). Notez l'ARN d'exécution de l'agent indiqué dans la sortie : vous en aurez besoin pour appeler l'agent à l'étape suivante.
Exemple
Étape 5 : utilisez le jeton 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 doté votre environnement d'exécution d'une passerelle à l'étape 3, ajoutez le moteur d'exécution déployé en tant que cible de passerelle avant de l'appeler (voir Cibles AgentCore d'exécution), puis appelez via le point de terminaison de 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 d'utiliser le rôle d'exécution d'agent pour les autorisations d'identité et exigeront que la politique précédente soit attaché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 obligatoire 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')
Procédez à l'appel de l'agent en suivant le reste des instructions suivantes.
Appelez l'agent avec OAuth.
Exemple
Réponses aux erreurs OAuth
OAuth-configured les agents respectent les normes d'authentification RFC 6749 (OAuth 2.0
401 Non autorisé - Authentification manquante
Lorsqu'aucun jeton porteur n'est fourni dans l'en-tête d'autorisation, 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 figurant dans l' WWW-Authenticate en-tête pointe vers l'API Protected Resource Metadata (PRM). 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 console AWS ou la CLI) 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 accéder aux outils à l'aide d'OAuth
Dans cette section, vous allez apprendre à connecter le code de votre agent aux fournisseurs AgentCore d'informations d'identification pour un accès sécurisé aux ressources externes à l'aide de l'authentification OAuth2.
L'exemple suivant montre comment votre agent exécuté dans Agent Runtime peut demander le consentement OAuth des utilisateurs, leur permettant 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 avec AgentCore Identity.
Étape 6.1 : Configuration des fournisseurs d'informations d'identification
Pour configurer un fournisseur d'informations d'identification Google, vous devez :
-
Enregistrez votre application auprès de Google pour obtenir l'ID client et le secret du client
-
Créez un fournisseur d'informations d'identification OAuth à l'aide de la CLI. AWS Remplacez
your-client-idetyour-client-secretpar votre identifiant client Google OAuth2 actuels et votre code secret client :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
callbackUrlde la CreateOauth2CredentialProviderré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 : Permettre à l'agent de lire le contenu de Google Drive
Créez un outil avec les annotations du SDK principal de l'agent, comme indiqué 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 d'un serveur de rappel local pour gérer la liaison de session, reportez-vous à https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/03-AgentCore-identity/05-Outbound_Auth_3lo/oauth2_callback_server.py
Que se passe-t-il dans les coulisses
Lorsque ce code s'exécute, le processus suivant se produit :
-
Agent Runtime autorise le jeton entrant conformément à l'autorisateur configuré.
-
Agent Runtime échange ce jeton contre un jeton d'accès à la charge de travail via
bedrock-agentcore:GetWorkloadAccessTokenForJWTl'API et le transmet au code de votre agent via l'en-têteWorkloadAccessTokende charge utile. -
Lors de l'invocation de l'outil, votre agent utilise ce jeton d'accès à la charge de travail pour appeler l'API Token Vault
bedrock-agentcore:GetResourceOauth2Tokenet générer une URL d'authentification 3LO. -
Votre agent envoie cette URL à l'application cliente comme indiqué dans la
on_auth_urlméthode. -
L'application cliente présente cette URL à l'utilisateur, qui autorise l'agent à accéder à son compte Google Drive.
-
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 à utiliser ce jeton sans que celui-ci ait à donner son consentement pour chaque demande.
Note
AgentCore Identity Service stocke le jeton d'accès Google dans le coffre à AgentCore jetons 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) Propagation d'un jeton JWT vers Runtime AgentCore
Vous pouvez éventuellement transmettre un en-tête d'autorisation à un AgentCore environnement d'exécution pour extraire des revendications. Cela peut être fait en utilisant la configuration de la liste d'autorisation des en-têtes 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.
requirements.txt
Ajoutez une dépendance PyJWT au requirements.txt fichier dans votre projet généré.
PyJWT
Mettez à jour votre code d'agent
Modifiez le fichier d'agent principal de votre projet généré (généralement src/main.py ou similaire, selon le framework que vous avez choisi) comme indiqué dans le code suivant. Vous pouvez ignorer la validation de la signature du jeton ici puisqu'elle a déjà été validée par AgentCore Runtime lorsque l'autorisation entrante a été effectuée.
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 : Création de l'agent avec la liste d'autorisation d'en-tête de demande
Utilisez la AgentCore CLI pour configurer l'agent avec l'en-tête de demande allowlist. Accédez au répertoire de projet que vous avez généré et exécutez :
agentcore create --name HelloAgent --framework Strands --model-provider Bedrock --memory none # Now deploy the agent runtime agentcore deploy
Note
La AgentCore CLI crée la structure du projet et les fichiers de configuration. Ajustez la configuration de l'agent agentcore/agentcore.json selon les besoins en fonction de votre choix de framework.
Étape 7.3 : Invoquez votre agent
Invoquez votre agent en utilisant 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 avec l'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'autorisateur de l'agent doit correspondre à la réclamation de l'émetteur figurant dans le jeton. Procédez comme suit pour vérifier 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 doit correspondre à la valeur de réclamation iss indiquée dans le jeton.
-
-
-
client_idla réclamation contenue dans le 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
-
Confirmez que cela correspond à la demande client_id dans le jeton décodé
-
-
audla réclamation contenue dans le jeton doit correspondre à l'une desallowedAudienceentrées de l'autorisateur, si elle est fournie-
Notez la liste d'audience que vous avez fournie lors de la création de l'agent
-
Confirmez que cela correspond à l'
audaffirmation contenue dans le 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.