Tutoriel : Authentifier un utilisateur en cours de session

Si la sécurité du chat Web est activée, vous devez définir un identifiant pour le client au début de la session dans le cadre du jeton Web JSON (JWT) que vous utilisez pour signer les messages. Pour les utilisateurs non authentifiés, il s'agit généralement d'un identifiant généré, qui ne peut être modifié après la création du JWT. Cependant, vous pouvez utiliser une variable privée pour authentifier un utilisateur plus tard dans la session.

Lorsque la sécurité du chat en ligne est activée, l'identifiant de l'utilisateur associé à chaque message est basé sur l'allégation " sub dans la charge utile du JWT. Cette valeur doit être définie au début de la session, lors de la création du JWT, et ne peut être modifiée pendant la durée de la session. Pour les utilisateurs non authentifiés (anonymes), vous utiliserez généralement un identifiant généré, enregistré dans un cookie, afin de garantir que chaque client unique ne soit compté qu'une seule fois à des fins de facturation.

Cependant, il se peut que vous souhaitiez que vos clients puissent s'authentifier au milieu d'une session (par exemple, pour effectuer une action qui met à jour les informations du compte de l'utilisateur). Comme l'ID utilisateur généré dans la demande " sub ne peut pas être modifié, vous avez besoin d'un autre moyen d'authentifier l'utilisateur en toute sécurité. Vous pouvez le faire en stockant l'ID utilisateur authentifié du client en tant que variable privée dans la charge utile de l'utilisateur du JWT. (Vous pourriez stocker l'ID de l'utilisateur dans une variable de contexte ordinaire, mais ce ne serait pas sûr, car de telles variables peuvent être modifiées)

Pour une version complète et opérationnelle de l'exemple décrit dans ce tutoriel, voir Activation de la sécurité pour le chat web de l'assistant d'IA (complexe).

Pour une version du chat web avec un minimum de codes pour activer la sécurité, qui n'a pas de charges utiles cryptées et de changements d'utilisateur pendant la session, voir Activation de la sécurité pour le chat web de l'assistant d'IA (simple).

L'exemple de ce tutoriel, qui est basé sur un serveur Express pour Node.js, montre comment démarrer une session avec un identifiant d'utilisateur anonyme et comment authentifier l'utilisateur pendant la session.

  1. Créez une fonction appelée " getOrSetAnonymousID() qui génère un identifiant anonyme unique pour chaque client et le stocke dans un cookie (ou, si le cookie existe déjà, utilise l'identifiant stocké).

    Utiliser un cookie d'une durée de vie d'au moins 45 jours. Si vous ne conservez pas l'identifiant de l'utilisateur pendant plus de 30 jours, le même client peut être comptabilisé comme plusieurs utilisateurs différents au cours de la même période de facturation. (Cela peut encore se produire si le même utilisateur supprime le cookie ou utilise un autre navigateur)

function getOrSetAnonymousID(request, response) {
  let anonymousID = request.cookies['ANONYMOUS-USER-ID'];
  if (!anonymousID) {
    anonymousID = `anon-${uuid()}`;
  }

  response.cookie('ANONYMOUS-USER-ID', anonymousID, {
    expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 45), // 45 days.
    httpOnly: true,
  });

  return anonymousID;
}
  1. Dans la fonction que vous utilisez pour créer un JWT, utilisez l'identifiant anonyme renvoyé par la fonction " getOrSetAnonymousID() comme valeur de la demande " sub Ceci définit la valeur de l'ID utilisateur qui sera utilisé pour identifier le client de manière unique à des fins de facturation.

    En outre, récupérez toute valeur du cookie " SESSION_INFO, que nous utiliserons pour stocker les informations de connexion authentifiées. Si une valeur existe, elle est stockée dans la revendication privée " user_payload du JWT. (Si l'utilisateur ne s'est pas encore authentifié, ce cookie n'existe pas encore)

const jwtContent = {
  sub: anonymousUserID,
  user_payload: {
    name: 'Anonymous',
    custom_user_id: anonymousUserID,
  },
};

if (sessionInfo) {
  jwtContent.user_payload.name = sessionInfo.userName;
  jwtContent.user_payload.custom_user_id = sessionInfo.customUserID;
}
  1. Créer une fonction pour gérer l'authentification des utilisateurs. Dans notre exemple, nous utilisons une simple fonction " authenticate() qui définit un identifiant d'utilisateur codé en dur, mais dans une application réelle, l'identifiant d'utilisateur serait probablement extrait d'une base de données après un contrôle d'authentification sécurisé. Stocker les informations relatives à l'utilisateur dans le cookie " SESSION_INFO
function authenticate(request, response) {

  const userInfo = {
    userName: 'Cade',
    customUserID: 'cade-id',
  };

  response.cookie('SESSION_INFO', JSON.stringify(userInfo), { encode: String });

  response.send('Ok');
}
  1. Lorsqu'un utilisateur se connecte, la fonction " authenticate() est appelée pour stocker les informations de l'utilisateur dans le cookie " SESSION_INFO. Appelez ensuite la fonction " createJWT() pour régénérer le JWT, en utilisant les informations de session mises à jour pour remplir la demande " user_payload

    Dans notre exemple, l'authentification est simulée par un simple clic sur un bouton. Le même bouton permet également de simuler la déconnexion en supprimant le cookie :

    async function onClick() {
      if (getCookieValue('SESSION_INFO')) {
        document.cookie = 'SESSION_INFO=; Max-Age=0';
      } else {
        await fetch('http://localhost:3001/authenticate');
      }
    
      const result = await fetch('http://localhost:3001/createJWT');
      const newToken = await result.text();
    
      webChatInstance.updateIdentityToken(newToken);
    
      updateUI();
    }
    

    L'identifiant anonyme dans la demande " sub continuera à être utilisé pour suivre le client à des fins de facturation, mais l'identifiant réel du client est désormais stocké séparément dans la charge utile de l'utilisateur.

  2. Dans vos actions, vous pouvez désormais accéder à l'identifiant réel du client en faisant référence à la variable contextuelle privée " user_payload

${system_integrations.chat.private.user_payload}.custom_user_id

Pour obtenir un code de travail complet, consultez l'exemple " Enabling security for AI assistant web chat".

Si vous êtes tenu de vous conformer aux exigences du GDPR, vous devrez peut-être stocker de manière persistante les identifiants d'utilisateurs anonymes générés, en particulier pour les utilisateurs anonymes qui se connectent ensuite avec des identifiants d'utilisateur. Le stockage de ces identifiants vous permet de supprimer ultérieurement toutes les données associées à un client individuel si on vous le demande.