Tutoriel: Authentification d'un utilisateur au milieu d'une session
Si la sécurité de la discussion Web est activée, vous devez définir un ID utilisateur 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 qui ne sont pas authentifiés, il s'agit généralement d'un ID généré et il ne peut pas être modifié après la création du jeton JWT. Toutefois, vous pouvez utiliser une variable privée pour authentifier un utilisateur ultérieurement dans la session.
Lorsque la sécurité de la discussion Web est activée, l'ID utilisateur associé à chaque message est basé sur la revendication sub dans le contenu JWT. Cette valeur doit être définie au début de la session, lorsque le jeton Web JSON
(JWT) est créé, et ne peut pas être modifiée pendant la durée de vie de la session. Pour les utilisateurs non authentifiés (anonymes), vous utilisez généralement un ID généré, sauvegardé dans un cookie, pour vous assurer que chaque client unique
n'est compté qu'une seule fois à des fins de facturation.
Toutefois, vous souhaiterez peut-être que vos clients puissent s'authentifier au milieu d'une session (par exemple, pour effectuer une action qui met à jour les informations de compte de l'utilisateur). Etant donné que l'ID utilisateur généré
dans la réclamation sub ne peut pas être modifié, vous avez besoin d'un autre moyen d'authentifier l'utilisateur en toute sécurité. Pour ce faire, vous pouvez stocker l'ID utilisateur authentifié réel du client en tant que variable
privée dans le contenu utilisateur du jeton Web JSON (JWT). (Vous pouvez stocker l'ID utilisateur dans une variable contextuelle ordinaire, mais cela ne serait pas sécurisé, car ces variables peuvent être modifiées.)
Pour une version complète et fonctionnelle de l'exemple décrit dans ce tutoriel, voir Activation de la sécurité pour la discussion Web(complexe)watsonx Assistant.
Pour une version de discussion Web avec des codes minimaux permettant d'activer la sécurité, qui ne comporte pas de contenu chiffré ni de modifications utilisateur pendant la session, voir Activation de la sécurité pour la discussion Web watsonx Assistant(simple).
Cet exemple dans ce tutoriel, qui est basé sur un serveur Express pour Node.js, montre comment démarrer une session avec un ID utilisateur anonyme, puis l'authentifier lors de la session.
-
Créez une fonction appelée
getOrSetAnonymousID()qui génère un ID utilisateur anonyme unique pour chaque client et le stocke dans un cookie (ou, si le cookie existe déjà, utilise l'ID utilisateur stocké).Utilisez un cookie qui dure au moins 45 jours. Si vous ne stockez pas l'ID utilisateur pendant plus de 30 jours, le même client peut être compté comme plusieurs utilisateurs différents au cours de la même période de facturation. (Cela peut toujours se produire si le même utilisateur supprime le cookie ou utilise un navigateur différent.)
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;
}
-
Dans la fonction que vous utilisez pour créer un jeton JWT, utilisez l'ID anonyme renvoyé par la fonction
getOrSetAnonymousID()comme valeur de la revendicationsub. Définit la valeur de l'ID utilisateur qui sera utilisé pour identifier de manière unique le client à des fins de facturation.En outre, extrayez toute valeur du cookie
SESSION_INFO, que nous utiliserons pour stocker les informations de connexion authentifiées. Si une valeur existe, stockez-la dans la réclamation privéeuser_payloaddu JWT. (Si l'utilisateur n'a pas encore été 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;
}
- Créez une fonction pour gérer l'authentification d'utilisateur. Dans notre exemple, nous utilisons une fonction
authenticate()simple qui définit un ID utilisateur codé en dur, mais dans une application réelle, l'ID utilisateur serait probablement extrait d'une base de données après une vérification d'authentification sécurisée. Stockez les informations utilisateur dans le cookieSESSION_INFO.
function authenticate(request, response) {
const userInfo = {
userName: 'Cade',
customUserID: 'cade-id',
};
response.cookie('SESSION_INFO', JSON.stringify(userInfo), { encode: String });
response.send('Ok');
}
-
Lorsqu'un utilisateur se connecte, appelez la fonction
authenticate()pour stocker les informations utilisateur dans le cookieSESSION_INFO. Appelez ensuite la fonctioncreateJWT()pour régénérer le jeton Web JSON (JWT), à l'aide des informations de session mises à jour pour remplir la revendicationuser_payload.Dans notre exemple, l'authentification est simulée à l'aide d'un simple clic sur un bouton. Le même bouton simule également 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'ID anonyme de la réclamation
subcontinuera d'être utilisé pour suivre le client à des fins de facturation, mais l'ID utilisateur réel du client est désormais stocké séparément dans le contenu utilisateur. -
Dans vos actions, vous pouvez désormais accéder à l'ID utilisateur réel du client en référençant la variable contextuelle privée
user_payload:
${system_integrations.chat.private.user_payload}.custom_user_id
Pour obtenir le code de travail complet, voir l'exemple Activation de la sécurité pour la discussion Web watsonx Assistant.
Si vous devez vous conformer aux exigences du RGPD, vous devrez peut-être stocker en permanence les ID utilisateur anonymes générés, en particulier pour les utilisateurs anonymes qui se connectent ultérieurement avec les données d'identification de l'utilisateur. Le stockage de ces ID utilisateur vous permet de supprimer ultérieurement toutes les données associées à un client individuel si vous y êtes invité.