Un connecteur (serveur MCP) peut appeler votre API au nom de l'utilisateur connecté sur le site qui héberge le chatbot : l'API voit cet utilisateur (sub), avec ses droits et son contexte, comme s'il faisait les appels lui-même. Il ne passe jamais par Squadico. Ce guide s'adresse à la personne qui administre votre fournisseur d'identité et à celle qui intègre le chatbot.
Comment ça marche
Avant chaque message, le chatbot demande à votre page le token de l'utilisateur connecté (getSubjectToken) et l'envoie à Squadico.
Squadico échange ce token auprès de votre serveur d'autorisation contre un nouveau token : même utilisateur, destiné uniquement au connecteur. C'est le standard OAuth 2.0 Token Exchange (RFC 8693), ou le flux « on-behalf-of » (RFC 7523) pour Microsoft Entra ID.
Squadico appelle le connecteur avec ce nouveau token. Le token de votre site n'est jamais transmis au connecteur, ni conservé.
Le connecteur vérifie le token et appelle votre API au nom de l'utilisateur, idéalement par son propre échange de token.
Ce qu'il vous faut
Un serveur d'autorisation OAuth qui sait échanger des tokens (RFC 8693) ou faire du « on-behalf-of ».
Une application Squadico avec la vérification d'identité activée : le token n'est accepté que pour un visiteur dont votre serveur a signé l'identité (digest).
Un connecteur MCP qui accepte des tokens émis par ce serveur d'autorisation.
1. Dans votre fournisseur d'identité
Trois éléments, quel que soit le fournisseur : un client confidentiel pour Squadico autorisé à échanger des tokens ; un destinataire (audience) qui représente le connecteur ; et, selon les fournisseurs, le client Squadico dans l'audience des tokens de votre site.
Keycloak 26.2 et plus
Clients → Create client : « squadico », Client authentication activé, Standard flow activé, et cochez « Standard Token Exchange ». Valid redirect URIs : l'URL de rappel Squadico (voir étape 2). Copiez le secret (onglet Credentials).
Créez un client pour le connecteur, par exemple « route-planner » (Client authentication activé). Son identifiant sera l'audience demandée.
Client « squadico » → Client scopes → squadico-dedicated → Add mapper → Audience : Included Client Audience = route-planner, Add to access token activé. Sans ce mapper, Keycloak refuse de produire cette audience.
Client front de votre site → Client scopes → …-dedicated → Add mapper → Audience : Included Client Audience = squadico. Keycloak n'échange que les tokens dont le demandeur fait partie de l'audience.
Keycloak 23 à 26.1
Démarrez Keycloak avec --features=token-exchange,admin-fine-grained-authz (l'échange de token y est une fonctionnalité en preview, dite V1).
Créez le client « squadico » (confidentiel, Standard flow, URL de rappel) et le client du connecteur, comme pour Keycloak 26.
Client du connecteur → Permissions → activez les permissions, ouvrez « token-exchange » et associez-lui une politique de type Client qui autorise « squadico ».
Dans Squadico, renseignez toujours l'audience (l'identifiant du client du connecteur) — la V1 ne l'ajoute pas sinon — et mettez l'identifiant du client Squadico dans « Audience exigée du token transmis » : la V1 échange n'importe quel token du realm, Squadico le vérifie donc lui-même.
Okta
Créez une application de type API Services ou Web pour Squadico, avec un secret client, et autorisez le grant « Token Exchange » dans ses paramètres.
Dans votre serveur d'autorisation (Security → API), ajoutez un scope pour le connecteur et une règle d'accès qui autorise l'application Squadico à utiliser le grant Token Exchange.
Dans Squadico : type RFC 8693, scope = le scope créé (Okta l'exige), audience = l'audience de votre serveur d'autorisation.
Microsoft Entra ID
Inscrivez une application pour le connecteur et exposez une API (Expose an API → Application ID URI, par exemple api://route-planner).
Inscrivez une application pour Squadico avec un secret client, et donnez-lui la permission déléguée sur l'API du connecteur (API permissions), avec le consentement administrateur.
Les tokens de votre site doivent être émis pour l'application Squadico (audience = son Application ID URI) : c'est la condition du flux on-behalf-of.
Dans Squadico : type « On-behalf-of (RFC 7523) », scope = api://route-planner/.default.
Auth0
Auth0 propose l'échange de token via « Custom Token Exchange » : créez un profil d'échange et l'action qui valide le token reçu, selon la documentation Auth0.
Créez une application machine-to-machine pour Squadico, autorisée sur l'API du connecteur.
Dans Squadico : type RFC 8693, audience = l'identifiant de l'API du connecteur, et le type de token attendu par votre profil d'échange.
Autres serveurs (Ping, Curity, ForgeRock, Zitadel…)
Créez un client confidentiel pour Squadico et autorisez-le à utiliser le grant urn:ietf:params:oauth:grant-type:token-exchange.
Définissez le destinataire du connecteur (audience ou resource) et autorisez Squadico à le demander.
Dans Squadico, ajustez les réglages d'échange à ce qu'attend votre serveur : audience, scope, envoi de resource, méthode d'authentification du client.
2. Dans Squadico
Paramètres → votre organisation → Outils → le connecteur → Configurer OAuth : URL d'autorisation et de token de votre serveur d'autorisation (si elles n'ont pas été découvertes), identifiant et secret du client Squadico.
Ajoutez l'URL de rappel Squadico aux URL de redirection du client : elle sert à l'autorisation de l'organisation.
Autorisez le connecteur une fois au nom de l'organisation : ce jeton sert uniquement à lire la liste des outils, jamais à les appeler.
Identité utilisée pour les appels → « L'utilisateur du site qui héberge le chatbot », puis réglez l'échange (voir le tableau).
Les réglages d'échange
Réglage
Rôle
Par défaut
Type d'échange
RFC 8693 pour la plupart des serveurs ; on-behalf-of (RFC 7523) pour Entra ID.
RFC 8693
Type du token transmis
Ce que votre site envoie : access token, JWT ou ID token. Keycloak n'accepte que des access tokens.
Access token
Audience
Le destinataire demandé pour le nouveau token.
Aucune
Scope
Requis par certains serveurs (Okta, Entra ID).
Aucun
Envoyer resource
Envoie l'URL du connecteur (RFC 8707), comme le recommande la spécification MCP. À désactiver si votre serveur refuse ce paramètre.
Oui
Authentification du client
HTTP Basic, la méthode que tout serveur OAuth doit accepter, ou le secret dans le corps de la requête.
HTTP Basic
Audience exigée du token transmis
Si renseignée, Squadico refuse tout token qui ne la contient pas, avant même de demander l'échange.
Aucune
3. Sur votre site
Activez la vérification d'identité de l'application, calculez le digest de l'utilisateur sur votre serveur, et donnez au chatbot une fonction qui renvoie le token courant. Elle est appelée avant chaque message : renvoyez un token à jour, ou null si personne n'est connecté.
// On your server, when the page is rendered — never in the browser
const digest = createHmac('sha256', process.env.SQUADICO_IDENTITY_SECRET)
.update(user.id)
.digest('hex')
// In the page
const chatbot = document.querySelector('squadico-chatbot')
chatbot.user = { id: user.id, name: user.name, digest }
// Called before every message: return the current token, refreshed if needed
chatbot.getSubjectToken = () => auth.getAccessToken()
4. Sur votre connecteur MCP
Vérifiez la signature du token (clés publiques de votre serveur d'autorisation), son émetteur (iss) et que son audience (aud) désigne bien le connecteur.
sub est l'utilisateur ; azp (ou appid) désigne Squadico, utile pour tracer ou restreindre ce que fait un agent.
Pour appeler votre API, faites votre propre échange de token vers l'audience de l'API plutôt que de relayer le token reçu : la spécification MCP déconseille de relayer un token tel quel.
Tester
Obtenez un token d'un utilisateur de votre site, puis faites l'échange que fera Squadico. Le token obtenu doit contenir le même sub et l'audience du connecteur. Vous pouvez ensuite coller le token d'origine dans le champ « Token utilisateur de test » du bac à sable de votre application.
TOKEN_URL=https://<your-idp>/…/token
# The exchange Squadico makes (RFC 8693, HTTP Basic client authentication)
curl -s "$TOKEN_URL" \
-u "<squadico-client-id>:<squadico-client-secret>" \
-d grant_type=urn:ietf:params:oauth:grant-type:token-exchange \
-d subject_token="$USER_TOKEN" \
-d subject_token_type=urn:ietf:params:oauth:token-type:access_token \
-d audience=<connector-audience> \
-d resource=<connector-url>
# Expect a token with the same "sub" and the connector in "aud"
Dépannage
Symptôme
Cause probable
L'agent répond qu'aucune session n'a été transmise
Le site n'envoie pas de token (getSubjectToken), ou la vérification d'identité n'est pas activée sur l'application.
Refus « subject_token_needs_verified_identity »
Un token a été envoyé pour un visiteur dont l'identité n'est pas vérifiée : ajoutez le digest à user.
L'agent demande à l'utilisateur de se reconnecter
Le serveur d'autorisation a refusé l'échange : token expiré, client non autorisé à échanger, audience non autorisée, ou audience exigée absente du token.
403 ou invalid_client à l'échange
Client Squadico public au lieu de confidentiel, mauvais secret, ou méthode d'authentification du client non acceptée (essayez l'autre).
invalid_target ou paramètre non pris en charge
Le serveur refuse resource ou audience : décochez « Envoyer resource » ou retirez l'audience.