Lernprogramm: Benutzer mitten in einer Sitzung authentifizieren
Wenn die Web-Chat-Sicherheit aktiviert ist, müssen Sie eine Benutzer-ID für den Kunden zu Beginn der Sitzung als Teil des JSON Web Token (JWT) festlegen, das Sie zum Signieren von Nachrichten verwenden. Für Benutzer, die nicht authentifiziert sind, ist dies in der Regel eine generierte ID und kann nach der Erstellung des JWT nicht geändert werden. Sie können jedoch eine private Variable verwenden, um einen Benutzer später in der Sitzung zu authentifizieren.
Wenn die Web-Chat-Sicherheit aktiviert ist, basiert die Benutzer-ID, die jeder Nachricht zugeordnet ist, auf dem Anspruch sub in den JWT-Nutzdaten. Dieser Wert muss zu Beginn der Sitzung festgelegt werden, wenn das JWT erstellt wird,
und kann während der Lebensdauer der Sitzung nicht geändert werden. Für nicht authentifizierte (anonyme) Benutzer verwenden Sie in der Regel eine generierte ID, die in einem Cookie gespeichert ist, um sicherzustellen, dass jeder eindeutige Kunde
nur einmal zu Abrechnungszwecken gezählt wird.
Möglicherweise möchten Sie jedoch, dass sich Ihre Kunden während einer Sitzung authentifizieren können (z. B. um eine Aktion auszuführen, mit der die Kontoinformationen des Benutzers aktualisiert werden). Da die generierte Benutzer-ID im Anspruch
sub nicht geändert werden kann, benötigen Sie eine andere Möglichkeit, den Benutzer sicher zu authentifizieren. Dazu können Sie die tatsächliche authentifizierte Benutzer-ID des Kunden als private Variable in den Benutzernutzdaten
des JWT speichern. (Sie können die Benutzer-ID in einer normalen Kontextvariablen speichern, aber dies wäre nicht sicher, da solche Variablen geändert werden können.)
Eine vollständige, funktionierende Version des in diesem Lernprogramm beschriebenen Beispiels finden Sie unter Sicherheit für watsonx Assistant-Web-Chat aktivieren(komplex).
Eine Web-Chat-Version mit minimalen Codes zum Aktivieren der Sicherheit, die keine verschlüsselten Nutzdaten und Benutzeränderungen während der Sitzung enthält, finden Sie unter Sicherheit für watsonx Assistant-Web-Chat aktivieren(einfach).
Dieses Beispiel in diesem Lernprogramm, das auf einem Express-Server für Node.jsbasiert, zeigt, wie eine Sitzung mit einer anonymen Benutzer-ID gestartet und anschließend während der Sitzung authentifiziert wird.
-
Erstellen Sie eine Funktion mit dem Namen
getOrSetAnonymousID(), die eine eindeutige anonyme Benutzer-ID für jeden Kunden generiert und in einem Cookie speichert (oder, falls das Cookie bereits vorhanden ist, die gespeicherte Benutzer-ID verwendet).Verwenden Sie ein Cookie, das mindestens 45 Tage dauert. Wenn Sie die Benutzer-ID nicht länger als 30 Tage speichern, wird derselbe Kunde möglicherweise während desselben Abrechnungszeitraums als mehrere verschiedene Benutzer gezählt. (Dies kann immer noch passieren, wenn derselbe Benutzer das Cookie löscht oder einen anderen Browser verwendet.)
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;
}
-
Verwenden Sie in der Funktion, die Sie zum Erstellen eines JWT verwenden, die anonyme ID, die von der Funktion
getOrSetAnonymousID()zurückgegeben wird, als Wert des Anspruchssub. Damit wird der Wert der Benutzer-ID festgelegt, die zur eindeutigen Identifizierung des Kunden für Abrechnungszwecke verwendet wird.Rufen Sie außerdem einen beliebigen Wert aus dem Cookie
SESSION_INFOab, in dem authentifizierte Anmeldeinformationen gespeichert werden. Wenn ein Wert vorhanden ist, speichern Sie ihn im privaten Claimuser_payloaddes JWT. (Wenn der Benutzer noch nicht authentifiziert wurde, ist dieses Cookie noch nicht vorhanden)
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;
}
- Erstellen Sie eine Funktion zur Verarbeitung der Benutzerauthentifizierung. In unserem Beispiel verwenden wir eine einfache
authenticate()-Funktion, die eine fest codierte Benutzer-ID festlegt, aber in einer realen Anwendung würde die Benutzer-ID wahrscheinlich nach einer sicheren Authentifizierungsprüfung aus einer Datenbank abgerufen werden. Speichern Sie die Benutzerinformationen im 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');
}
-
Wenn sich ein Benutzer anmeldet, rufen Sie die Funktion
authenticate()auf, um die Benutzerinformationen im CookieSESSION_INFOzu speichern. Rufen Sie dann die FunktioncreateJWT()auf, um das JWT erneut zu erstellen, und verwenden Sie die aktualisierten Sitzungsinformationen, um den Anspruchuser_payloadzu füllen.In unserem Beispielwird die Authentifizierung mit einem einfachen Mausklick simuliert. Dieselbe Schaltfläche simuliert auch das Abmelden durch Löschen des Cookies:
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(); }Die anonyme ID im
sub-Anspruch wird weiterhin verwendet, um den Kunden zu Abrechnungszwecken zu verfolgen, aber jetzt wird die reale Benutzer-ID des Kunden separat in den Nutzdaten des Benutzers gespeichert. -
In Ihren Aktionen können Sie jetzt auf die reale Benutzer-ID des Kunden zugreifen, indem Sie auf die private Kontextvariable
user_payloadverweisen:
${system_integrations.chat.private.user_payload}.custom_user_id
Informationen zum vollständigen Arbeitscode finden Sie im Beispiel Sicherheit für watsonx Assistant-Web-Chat aktivieren.
Wenn Sie die DSGVO-Anforderungen erfüllen müssen, müssen Sie möglicherweise alle generierten anonymen Benutzer-IDs dauerhaft speichern, insbesondere für anonyme Benutzer, die sich später mit Benutzerberechtigungsnachweisen anmelden. Wenn Sie diese Benutzer-IDs speichern, können Sie später alle Daten löschen, die einem einzelnen Kunden zugeordnet sind, wenn Sie dazu aufgefordert werden.