- Client Credentials Flow : l’application agit pour son propre compte et s’authentifie elle-même. La requête peut avoir été initiée par un utilisateur, mais ce contexte sera perdu. Le service en aval ne connaît alors que l’identité de l’application appelante.
- On-Behalf-Of (OBO) Token Exchange : l’application reçoit un jeton limité aux portées de l’utilisateur et peut l’échanger contre un nouveau jeton pour appeler des services en aval. Cela préserve l’identité et le contexte de l’utilisateur final d’origine tout au long de la chaîne d’appel.
- conserve l’identité et les permissions de l’utilisateur d’origine
- est limité spécifiquement au Service B
- permet au Service B de prendre des décisions d’autorisation en fonction de l’utilisateur final
post-login, où :
event.transaction.protocolest défini suroauth2-token-exchange.event.transaction.actorsuit l’ensemble de la chaîne de délégation.
Lorsque vous achetez le module complémentaire Auth0 for AI Agents, vous pouvez utiliser la limite de débit maximale de l’Authentication API de votre niveau d’abonnement pour les échanges de jetons OBO. Par exemple, si vous utilisez Private Cloud 100 RPS, vous pouvez dépasser la limite de débit de 30 RPS des échanges de jetons OBO et tirer pleinement parti de la capacité de 100 RPS pour vos requêtes d’échange de jetons OBO. La limite de l’Authentication API est partagée et agit comme plafond global pour toutes les requêtes de l’Authentication API, y compris les connexions, les actualisations de jetons et les échanges de jetons combinés. Communiquez avec votre gestionnaire de compte technique pour en savoir plus.
Cas d’utilisation
- Les serveurs MCP qui doivent appeler des API de première partie au nom de l’utilisateur
- Les microservices qui doivent appeler des services en aval au nom de l’utilisateur
Fonctionnement
Exemple : appels du serveur MCP à une API de première partie
Étape 1 : Authentification de l’utilisateur
Étape 2 : échange OBO
La claim act
act (acteur) retrace l’ensemble de la chaîne de délégation. Chaque niveau act représente un service dans la chaîne d’appels, et le act.sub le plus externe identifie l’acteur actuel qui a effectué l’échange de jeton.
Dans notre exemple :
act.suble plus externe :mcp_server_client_id(le serveur MCP qui vient tout juste d’échanger le jeton)act.subimbriqué :spa_client_id(l’application cliente d’origine)
azp doit correspondre à la valeur du act.sub le plus externe, afin d’identifier le service qui a effectué l’échange de jeton le plus récent.
Si l’API de première partie appelle un autre service en aval (https://calendar-api.acme.com), la chaîne de délégation s’étendrait :
act imbriqués.
Mettez en cache les jetons d’accès pendant toute la durée de validité du jeton au lieu de demander un nouveau jeton pour chaque appel d’API. Les jetons d’accès peuvent être réutilisés tant qu’ils n’ont pas expiré; des échanges de jetons à répétition gaspillent des ressources, augmentent la latence et peuvent vous faire atteindre les limites de requêtes.
Utilisateur > serveur MCP > flux API
- Authentification de l’utilisateur : L’utilisateur s’authentifie auprès de l’application cliente. L’Auth0 Authorization Server émet le jeton A, limité au MCP Server.
- Requête initiale : L’application cliente appelle le MCP Server en transmettant le jeton A dans l’en-tête
Authorization: Bearer. - Validation et échange de jetons : Le MCP Server reçoit le jeton A, le valide et le transmet au point de terminaison
/oauth/tokende l’Auth0 Authorization Server. Au moyen de l’échange de jeton OBO, le MCP Server présente le jeton A commesubject_tokenet demande un nouveau jeton pour l’API de première partie. - Émission du jeton : L’Auth0 Authorization Server émet le jeton B. Le jeton B a le même
sub(ID utilisateur) que le jeton A, mais leaud(audience) correspond maintenant à l’API de première partie. - Requête en aval : Le MCP Server appelle l’API de première partie au moyen du jeton B. L’API valide le jeton B et constate que la requête est bien effectuée « au nom de » l’utilisateur d’origine.
Utilisateur > API1 > API2 > API3
- Authentification de l’utilisateur : L’utilisateur s’authentifie avec succès auprès d’une application cliente. L’Auth0 Authorization Server émet le jeton A, dont la portée est limitée à API1.
- Requête initiale : L’application cliente envoie une requête à API1 en transmettant le jeton A dans l’en-tête
Authorization: Bearer. - API1 délègue à API2 : API1 reçoit le jeton A, le valide, puis le transmet au point de terminaison
/oauth/tokende l’Auth0 Authorization Server. En utilisant l’échange de jeton OBO, API1 présente le jeton A commesubject_tokenet demande un nouveau jeton pour API2. - Émission de jeton : L’Auth0 Authorization Server accorde un nouveau jeton d’accès, le jeton B, à API1. Le jeton B a le même
sub(ID utilisateur) que le jeton A, mais leaud(audience) est maintenant API2. - Requête en aval : API1 envoie une requête à API2 à l’aide du jeton B.
- API2 délègue à API3 : API2 reçoit le jeton B, le valide, puis le transmet au point de terminaison
/oauth/tokende l’Auth0 Authorization Server. En utilisant l’échange de jeton OBO, API2 présente le jeton B commesubject_tokenet demande un nouveau jeton pour API3. - Émission de jeton : L’Auth0 Authorization Server accorde un nouveau jeton d’accès, le jeton C, à API2. Le jeton C a le même
sub(ID utilisateur) que les jetons A et B, mais leaud(audience) est maintenant API3. - Requête en aval : API2 envoie une requête à API3 à l’aide du jeton C. API3 valide le jeton C et constate que la requête est bien effectuée « au nom de » l’utilisateur d’origine.
Prérequis
- Définissez
app_typesurresource_server. - Définissez
resource_server_identifiersur un identifiant de serveur de ressources valide, c.-à-d.https://my-api.example.com. Auth0 utilise l’identifiant du serveur de ressources comme paramètreaudiencedans les requêtes d’autorisation.
Créer un client d’API personnalisé
- Auth0 Dashboard
- Management API
Pour créer un client d’API personnalisé dans l’Auth0 Dashboard :

- Accédez à Applications > APIs et sélectionnez votre API backend.

- Sélectionnez Add Application et saisissez un nom d’application.
- Sélectionnez Add.

Créer un client grant
- Auth0 Dashboard
- Management API
- Accédez à Applications > Applications et sélectionnez votre client d’API personnalisée.
- Sous API Access, repérez votre serveur de ressources (c.-à-d.
https://my-api.example.com) et sélectionnez Edit. - Sous User-Delegated Access, sélectionnez Grant Access, puis sélectionnez les permissions à accorder, ou Always grant all permissions.
- Sélectionnez Save.
Configurer l’échange de jetons OBO
- Auth0 Dashboard
- Management API
- Accédez à Applications > Applications et sélectionnez votre client d’API personnalisé.
- Sous Token Exchange, activez On-Behalf-Of Token Exchange.
- Sélectionnez Save.

Effectuer un échange de jetons OBO
auth0-api-js, auth0_api_python ou l’Authentication API.
Mettez les jetons d’accès en cache pour toute la durée de vie du jeton au lieu de demander un nouveau jeton pour chaque appel d’API. Les jetons d’accès peuvent être réutilisés jusqu’à leur expiration; des échanges de jetons répétés gaspillent des ressources, augmentent la latence et peuvent entraîner l’application de limites de débit.
- JavaScript
- Python
- cURL
Avant de commencer, assurez-vous d’avoir installé la bibliothèque Ensuite, utilisez la méthode
auth0-api-js et ses dépendances.Commencez par initialiser ApiClient avec les identifiants de votre serveur MCP :getTokenOnBehalfOf() pour procéder à l’échange de jetons :getTokenOnBehalfOf() retourne un objet contenant :accessToken: Le nouveau token pour votre API en avalscope: Les scopes accordésexpiresIn: La durée d’expiration du token, en secondes
Token Binding
- DPoP : calculez l’empreinte JWK SHA-256 du
jwkdans la preuve DPoP entrante (conformément à la RFC 7638) et vérifiez qu’elle correspond à la revendicationcnf.jktdu jeton de sujet. Auth0 n’effectue pas cette vérification durant l’échange de jetons. - mTLS : calculez l’empreinte SHA-256, encodée en base64url, de l’encodage DER du certificat client et vérifiez qu’elle correspond à la revendication
cnf.x5t#S256du jeton de sujet.
/oauth/token.
Si aucune preuve DPoP ni aucun certificat mTLS n’est présenté, Auth0 émet un jeton porteur non lié, quel que soit l’état de liaison du jeton de sujet initial.
Transitions entre les mécanismes de liaison et capacités incompatibles : Le service intermédiaire peut changer de mécanisme de liaison durant un échange OBO (par exemple, de DPoP à mTLS), à condition de posséder les identifiants nécessaires au nouveau mécanisme (par exemple, un certificat mTLS provisionné). Le jeton nouvellement émis reflète le nouveau type de liaison.
Avant l’échange, vérifiez que l’API en aval prend en charge le mécanisme de liaison présenté. Auth0 ne valide pas la compatibilité des mécanismes; il émettra le jeton dans tous les cas. Si l’API en aval ne prend pas en charge le mécanisme présenté, elle rejettera le jeton à l’exécution. Si les mécanismes ne peuvent pas être conciliés, ne tentez pas l’échange; retournez plutôt une erreur à l’appelant.
Nonces DPoP : Si le jeton de sujet initial a été émis pour un client public (comme une SPA ou une application mobile) à l’aide de DPoP avec un nonce émis par le serveur, le service intermédiaire pourrait ne pas disposer d’un nonce valide pour établir une nouvelle liaison au point de terminaison
/oauth/token. Dans ce cas, Auth0 retourne une erreur use_dpop_nonce accompagnée d’un nouveau nonce dans l’en-tête de réponse DPoP-Nonce. Réessayez la requête en utilisant ce nonce dans la nouvelle preuve DPoP.
Si le jeton de sujet initial était lié à l’émetteur, mais que le service intermédiaire ne présente pas de justificatifs de liaison (preuve DPoP ou certificat mTLS) au point de terminaison
/oauth/token, Auth0 ne rejette pas la requête; il émet plutôt un jeton porteur non lié sans signaler d’erreur. L’API en aval l’acceptera sans preuve de possession, ce qui le rend réutilisable s’il est intercepté. Si le serveur de ressources en aval exige des jetons liés à l’émetteur, ne transmettez pas le jeton non lié. Rejetez-le et renvoyez une erreur à l’appelant.Prise en charge d’Organizations
org_id. L’échange de jeton OBO préserve ce contexte de l’organisation tout au long de la chaîne de délégation.
Quand Auth0 reçoit une demande d’échange de jeton OBO avec un jeton d’accès associé à une organisation, il vérifie :
- que
org_idexiste dans votre tenant - que l’utilisateur (identifié par
sub) est membre de cette organisation
- contient la même claim
org_idque le jeton d’origine - applique les mêmes politiques RBAC propres à l’organisation
- rend le contexte de l’organisation accessible dans le déclencheur
post-logind’Actions via la propriétéevent.organization