- Client Credentials Flow : l’application agit en son propre nom 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 que l’identité de l’application appelante.
- Échange de jeton On-Behalf-Of (OBO) : l’application reçoit un jeton associé aux scopes 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’appels.
- Préserve l’identité et les autorisations 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ù :
- Le
event.transaction.protocolest défini suroauth2-token-exchange. - Le
event.transaction.actorsuit l’ensemble de la chaîne de délégation.
Si 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 jeton OBO. Par exemple, si vous utilisez Private Cloud 100 RPS, vous pouvez dépasser la limite de débit de 30 RPS pour les échanges de jeton OBO et utiliser la pleine capacité de 100 RPS pour vos requêtes d’échange de jeton OBO. La limite de l’Authentication API est partagée et agit comme plafond global pour toutes les requêtes à l’Authentication API, y compris les connexions, les actualisations de jetons et les échanges de jetons combinés. Communiquez avec votre Technical Account Manager pour en savoir plus.
Cas d’utilisation
- des serveurs MCP qui doivent appeler des API propriétaires au nom de l’utilisateur
- des microservices qui doivent appeler des services en aval au nom de l’utilisateur
Fonctionnement
Exemple : le serveur MCP appelle une API propriétaire
Étape 1 : Authentification de l’utilisateur
| Claim | Valeur | Description |
|---|---|---|
sub | auth0|user123 | L’identité de l’utilisateur final |
aud | https://mcp-server.example.com | Jeton destiné au serveur MCP |
azp (ou client_id selon le profil du jeton d’accès) | spa_client_id | L’application qui a demandé le jeton |
Étape 2 : échange OBO
| Revendication | Valeur | Description |
|---|---|---|
sub | auth0|user123 | Même identité utilisateur conservée |
aud | https://first-party-api.example.com | Jeton destiné à l’API de première partie |
azp (ou client_id selon le profil du jeton d’accès) | mcp_server_client_id | Application qui a demandé le jeton (le serveur MCP qui a effectué l’échange) |
act | {"sub": "mcp_server_client_id","act": {"sub": "spa_client_id"}} | Chaîne de délégation montrant tous les acteurs impliqués |
La revendication act
act (acteur) permet de suivre 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 ayant 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 d’origine)
azp doit correspondre à la valeur du act.sub le plus externe et identifier le service qui a effectué l’échange de jeton le plus récemment.
Si l’API propriétaire 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 pour toute la durée de vie du jeton au lieu de demander un nouveau jeton pour chaque appel à l’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.
Utilisateur > serveur MCP > flux API
- Authentification de l’utilisateur : L’utilisateur s’authentifie auprès de l’application cliente. Le serveur d’autorisation Auth0 émet le jeton A, avec un scope pour le serveur MCP.
- Requête initiale : L’application cliente appelle le serveur MCP en transmettant le jeton A dans l’en-tête
Authorization: Bearer. - Validation et échange de jeton : Le serveur MCP reçoit le jeton A, le valide et le transmet au point de terminaison
/oauth/tokendu serveur d’autorisation Auth0. À l’aide de l’échange de jetons OBO, le serveur MCP présente le jeton A commesubject_tokenet demande un nouveau jeton pour l’API propriétaire. - Émission du jeton : Le serveur d’autorisation Auth0 é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 propriétaire. - Appel au service en aval : Le serveur MCP appelle l’API propriétaire à l’aide du jeton B. L’API valide le jeton B et constate que la requête est légitimement 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. Le serveur d’autorisation Auth0 émet le jeton A, dont le scope est défini pour API1.
- Requête initiale : L’application cliente appelle 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 l’envoie au point de terminaison
/oauth/tokendu serveur d’autorisation Auth0. À l’aide de l’échange de jetons OBO, API1 présente le jeton A commesubject_tokenet demande un nouveau jeton pour API2. - Émission du jeton : Le serveur d’autorisation Auth0 accorde à API1 un nouveau jeton d’accès, le jeton B. Le jeton B a le même
sub(id utilisateur) que le jeton A, mais leaud(audience) est maintenant API2. - Appel 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 l’envoie au point de terminaison
/oauth/tokendu serveur d’autorisation Auth0. À l’aide de l’échange de jetons OBO, API2 présente le jeton B commesubject_tokenet demande un nouveau jeton pour API3. - Émission du jeton : Le serveur d’autorisation Auth0 accorde à API2 un nouveau jeton d’accès, le jeton C. Le jeton C a le même
sub(id utilisateur) que les jetons A et B, mais leaud(audience) est maintenant API3. - Appel 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 l’identifiant valide du serveur de ressources, c.-à-d.https://my-api.example.com. Auth0 utilise l’identifiant du serveur de ressources comme paramètre audience dans les appels 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 de 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é.
- 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 les autorisations à 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ée.
- Sous Token Exchange, activez On-Behalf-Of Token Exchange.
- Sélectionnez Save.

Effectuer l’échange de jetons OBO
auth0-api-js, auth0_api_python ou l’API d’authentification.
Mettez en cache les jetons d’accès pendant toute leur durée de validité 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 vous faire atteindre les 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() renvoie un objet contenant :accessToken: le nouveau jeton pour votre API en avalscope: les scopes accordésexpiresIn: le délai d’expiration du jeton, en secondes
Prise en charge des organisations
org_id. L’échange de jetons OBO préserve ce contexte organisationnel tout au long de la chaîne de délégation.
Lorsque Auth0 reçoit une demande d’échange de jetons OBO avec un jeton d’accès associé à une organisation, il valide :
- que
org_idexiste dans votre locataire - que l’utilisateur (identifié par
sub) est membre de cette organisation
- contient la même revendication
org_idque le jeton d’origine - applique les mêmes politiques RBAC propres à l’organisation
- rend le contexte organisationnel disponible dans le déclencheur Actions
post-loginau moyen de la propriétéevent.organization