L’API REST (clients, réponses, etc.) est décrite dans la page Pour commencer.
Ce que l’option protège
Sur un agent Privé :- Une URL d’agent divulguée ne sert à rien sans un jeton signé par votre serveur. Copier le snippet ou l’UUID de l’agent sur un autre site ne permet pas de discuter avec lui.
- Chaque utilisateur ne voit que son propre historique. La session est liée à un utilisateur (
sub) et à un agent : elle ne donne accès à aucune autre conversation. - La révocation est immédiate : une rotation de la clé, ou la désactivation de l’option, coupe toutes les sessions en cours.
Ce qu’elle ne protège pas
- Elle ne masque pas l’URL ni l’UUID de l’agent, qui restent visibles dans le code source de vos pages.
- Un agent Public reste accessible anonymement, avec ou sans
userToken, et l’historique d’un utilisateur n’y est pas confidentiel. Pour réserver l’agent à vos utilisateurs authentifiés, passez-le en Privé (voir Mise en place sans interruption). - Les métadonnées d’un utilisateur sont partagées entre les agents de votre compte. Si vous gardez un autre agent Public et que vous enrichissez vos utilisateurs via l’API (
/api/v1/customers), ces métadonnées restent lisibles par qui connaît l’identifiant de l’utilisateur. Dans ce cas, passez aussi cet agent en Privé, ou n’y placez pas de données sensibles. - Elle vaut ce que vaut votre authentification : toute personne qui obtient un jeton valide peut ouvrir une session au nom de cet utilisateur tant que le jeton n’a pas expiré. Ne délivrez de jeton qu’à l’utilisateur connecté et gardez une durée de vie courte.
- Les utilisateurs de votre entreprise connectés à Moustache AI conservent l’accès aux agents Privés, comme aujourd’hui.
Prérequis
- L’option est activée sur votre compte par l’équipe Moustache AI. Tant qu’elle ne l’est pas, la section « Identité vérifiée du widget » de la Console l’indique ; contactez-nous pour l’activer.
- Une clé secrète est générée par un administrateur : Console > Administration > Identité vérifiée du widget > Générer la clé. La clé commence par
mwsk_. - La clé est stockée côté serveur uniquement (variable d’environnement, coffre de secrets). Elle ne doit jamais apparaître dans du code exécuté par le navigateur, ni dans votre dépôt.
chat.mjs). L’intégration par iframe directe (/chat/<uuid>?userIdentifier=…) ne la prend pas en charge.
Le jeton utilisateur (JWT)
Votre serveur signe un JWT par utilisateur :
Une tolérance de 60 secondes est appliquée sur les dates pour absorber un léger décalage d’horloge.
Le jeton ne sert qu’au démarrage du widget (et à son renouvellement, voir plus bas) : une durée de 10 minutes suffit et limite l’intérêt d’un jeton intercepté.
Le
sub est rattaché au même utilisateur que le companyIdentifier de l’API publique : un utilisateur garde un seul historique quel que soit le canal.
Côté page
Dans le snippet copié depuis la Console, remplacezuserIdentifier par userToken. Si les deux sont fournis, userToken l’emporte (un avertissement s’affiche dans la console du navigateur).
Forme simple : une chaîne, générée par votre serveur au rendu de la page.
Promise<string>. Le widget l’appelle à chaque fois qu’il a besoin d’un jeton neuf, ce qui permet le renouvellement automatique de la session.
userToken est fourni et que la vérification échoue, le widget ne s’affiche pas et un message d’erreur est écrit dans la console du navigateur (voir Erreurs).
Côté serveur
Les deux exemples exposent une route/moustache/token, réservée à l’utilisateur connecté, qui renvoie { "token": "…" }. Adaptez le nom de la route et la récupération de l’utilisateur à votre application.
Node.js (jose)
PHP (firebase/php-jwt)
Mise en place sans interruption
- Laissez l’agent en Public et déployez
userToken(serveur + page). Vérifiez que le widget s’ouvre, qu’aucune erreur n’apparaît dans la console du navigateur et que chaque utilisateur retrouve son historique. - Passez l’agent en Privé (réglages de l’agent, champ Accès). À partir de là, seuls les widgets munis d’un jeton valide fonctionnent.
userToken : une page restée sur userIdentifier seul ne pourra plus afficher le widget à vos visiteurs.
Rotation de la clé
Console > Administration > Identité vérifiée du widget > Régénérer la clé.- L’ancienne clé cesse de fonctionner immédiatement : les jetons signés avec elle sont refusés et toutes les sessions de widget en cours sont révoquées.
- Il n’y a pas de période de recouvrement : mettez à jour la clé sur votre serveur juste après la rotation. En attendant, le widget ne s’affiche pas (erreur
invalid_signature). - Régénérez la clé dès que vous soupçonnez une fuite.
Durée de session et renouvellement
- Une session de widget dure 12 heures.
- Le widget la renouvelle automatiquement avant d’ouvrir la fenêtre de discussion lorsqu’il lui reste moins de 30 minutes, et lorsqu’elle est refusée en cours d’utilisation (expirée ou révoquée) ; la fenêtre se recharge alors avec la nouvelle session et l’historique est conservé.
- Chaque renouvellement demande un nouveau jeton à
userToken. Avec une fonction, c’est transparent. Avec une chaîne, le widget réutilise le même jeton, qui aura expiré si vous suivez la recommandation de 10 minutes : il faudra recharger la page. Préférez la fonction pour les pages qui restent ouvertes longtemps (applications monopage, back-offices).
Erreurs
En cas d’échec, la console du navigateur affiche :POST …/api/chatbots/chat-ui/<uuid>/session et sa réponse JSON { "error", "code", "reason" }.
Sans requête vers Moustache AI, le code peut aussi valoir :
user_token_unavailable: votre fonctionuserTokena levé une erreur ;missing_user_token: elle a renvoyé une valeur vide ;network_error: la requête a été bloquée, par exemple par une politique CSP (autorisez l’hôte Moustache AI dansconnect-src).
the widget session was refused right after it was issued, la session a été refusée juste après sa création (par exemple une rotation de clé ou une désactivation au même moment) : vérifiez l’état de l’option et de la clé dans la Console.