Esercitazione: Autenticare un utente nel mezzo di una sessione
Se la sicurezza della chat web è abilitata, è necessario impostare un ID utente per il cliente all'inizio della sessione, come parte del JSON Web Token (JWT) utilizzato per firmare i messaggi. Per gli utenti non autenticati, si tratta in genere di un ID generato, che non può essere modificato dopo la creazione del JWT. Tuttavia, è possibile utilizzare una variabile privata per autenticare un utente in un secondo momento della sessione.
Con la sicurezza della chat web abilitata, l'ID utente associato a ciascun messaggio si basa sull'indicazione " sub nel payload JWT. Questo valore deve essere impostato all'inizio della sessione, quando viene creato il JWT, e non può essere modificato durante la durata della sessione. Per gli utenti non autenticati (anonimi), in genere si utilizza un ID generato, salvato in un cookie, per garantire che ogni cliente unico venga conteggiato una sola volta ai fini della fatturazione.
Tuttavia, si potrebbe desiderare che i clienti siano in grado di autenticarsi nel bel mezzo di una sessione (ad esempio, per completare un'azione che aggiorna le informazioni dell'account dell'utente). Poiché l'ID utente generato nella richiesta 'sub non può essere modificato, è necessario un altro modo per autenticare l'utente in modo sicuro. È possibile farlo memorizzando l'ID utente autenticato del cliente come variabile privata nel payload utente del JWT. (Si potrebbe memorizzare l'ID utente in una normale variabile di contesto, ma non sarebbe sicuro, perché tali variabili possono essere modificate)
Per una versione completa e funzionante dell'esempio descritto in questo tutorial, consultare Abilitazione della sicurezza per la chat web dell'assistente AI (versione avanzata).
Per una versione di chat web con codice minimo per abilitare la sicurezza, che non prevede payload crittografati e modifiche dell'utente durante la sessione, vedere Abilitazione della sicurezza per la chat web dell'assistente AI (semplice).
L'esempio di questo tutorial, basato su un server Express per Node.js, mostra come avviare una sessione con un ID utente anonimo e poi autenticare l'utente durante la sessione.
Creare una funzione chiamata "
getOrSetAnonymousID()che generi un ID utente anonimo unico per ogni cliente e lo memorizzi in un cookie (o, se il cookie esiste già, utilizzi l'ID utente memorizzato).
Utilizzare un cookie che duri almeno 45 giorni. Se non si memorizza l'ID utente per più di 30 giorni, lo stesso cliente potrebbe essere conteggiato come più utenti diversi durante lo stesso periodo di fatturazione. (Questo può accadere anche se lo stesso utente cancella il cookie o utilizza un browser diverso)
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;
}
Nella funzione utilizzata per creare un JWT, utilizzare l'ID anonimo restituito dalla funzione '
getOrSetAnonymousID()come valore della richiesta 'sub. Imposta il valore dell'ID utente che verrà utilizzato per identificare in modo univoco il cliente ai fini della fatturazione.
Inoltre, recuperare qualsiasi valore dal cookie " SESSION_INFO, che verrà utilizzato per memorizzare le informazioni di login autenticate. Se esiste un valore, memorizzarlo nella richiesta privata 'user_payload del JWT. (Se l'utente non si è ancora autenticato, questo cookie non esiste ancora)
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;
}
Creare una funzione per gestire l'autenticazione degli utenti. Nel nostro esempio, stiamo usando una semplice funzione "
authenticate()che imposta un ID utente codificato, ma in un'applicazione reale l'ID utente verrebbe probabilmente recuperato da un database dopo un controllo di autenticazione sicuro. Memorizzare le informazioni dell'utente nel 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');
}
Quando un utente accede, chiamare la funzione '
authenticate()per memorizzare le informazioni dell'utente nel cookie 'SESSION_INFO. Quindi richiamare la funzione 'createJWT()per rigenerare il JWT, utilizzando le informazioni di sessione aggiornate per popolare la richiesta 'user_payload.
Nel nostro esempio, l'autenticazione viene simulata con un semplice clic su un pulsante. Lo stesso pulsante simula anche il logout cancellando il 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 anonimo nella richiesta " sub continuerà a essere utilizzato per tracciare il cliente ai fini della fatturazione, ma ora l'ID utente reale del cliente è memorizzato separatamente nel payload dell'utente.
Nelle azioni, è ora possibile accedere all'ID utente reale del cliente facendo riferimento alla variabile di contesto privata '
user_payload:
${system_integrations.chat.private.user_payload}.custom_user_id
Per il codice funzionante completo, consultare l'esempio "Abilitazione della sicurezza per la chat web dell'assistente AI".
Se si devono rispettare i requisiti del GDPR, potrebbe essere necessario memorizzare in modo persistente gli ID utente anonimi generati, soprattutto per gli utenti anonimi che in seguito accedono con le credenziali utente. La memorizzazione di questi ID utente consente di cancellare in seguito tutti i dati associati a un singolo cliente, se richiesto.