Esercitazione: autenticazione di un utente durante una sessione
Se la sicurezza della chat Web è abilitata, è necessario impostare un ID utente per il cliente all'inizio della sessione come parte del JWT (JSON Web Token) utilizzato per firmare i messaggi. Per gli utenti non autenticati, questo è di solito un ID generato e non può essere modificato dopo la creazione del JWT. Tuttavia, è possibile utilizzare una variabile privata per autenticare un utente successivamente nella sessione.
Con la protezione della chat web abilitata, l'ID utente associato a ciascun messaggio si basa sulla richiesta 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 univoco venga conteggiato solo una volta per scopi di fatturazione.
Tuttavia, è possibile che si desideri che i clienti siano in grado di eseguire l'autenticazione nel corso di una sessione (ad esempio, per completare un'azione che aggiorna le informazioni sull'account dell'utente). Poiché l'ID utente generato
nell'asserzione sub non può essere modificato, è necessario un altro modo per autenticare l'utente in modo sicuro. Puoi farlo memorizzando l'ID utente autenticato effettivo del cliente come una variabile privata nel payload utente
del JWT. È possibile memorizzare l'ID utente in una variabile di contesto ordinaria, ma ciò non è sicuro, poiché tali variabili possono essere modificate.
Per una versione completa dell'esempio descritto in questa esercitazione, vedi Abilitazione della sicurezza per watsonx Assistant web chat(complex).
Per una versione della chat web con codici minimi per abilitare la sicurezza, che non ha payload codificati e modifiche utente durante la sessione, vedi Abilitazione della sicurezza per la chat web watsonx Assistant(semplice).
Questo esempio in questa esercitazione, che si basa su un server Express per Node.js, mostra come avviare una sessione con un ID utente anonimo e quindi autenticare l'utente durante la sessione.
-
Creare una funzione denominata
getOrSetAnonymousID()che genera un ID utente anonimo univoco per ogni cliente e lo memorizza in un cookie (oppure, se il cookie esiste già, utilizza l'ID utente memorizzato).Utilizzare un cookie che dura 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ò ancora accadere se lo stesso utente elimina 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 richiestasub. Imposta il valore dell'ID utente che verrà utilizzato per identificare in modo univoco il cliente a scopo di fatturazione.Inoltre, richiamare qualsiasi valore dal cookie
SESSION_INFO, che verrà utilizzato per memorizzare le informazioni di accesso autenticate. Se esiste un valore, memorizzarlo nella richiesta privatauser_payloaddel JWT. (Se l'utente non ha ancora eseguito l'autenticazione, 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 utente. In questo esempio, si utilizza una funzione
authenticate()semplice che imposta un ID utente codificato, ma in un'applicazione reale l'ID utente verrà probabilmente richiamato da un database dopo un controllo di autenticazione sicuro. Memorizzare le informazioni utente nel 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');
}
-
Quando un utente accede, richiamare la funzione
authenticate()per memorizzare le informazioni utente nel cookieSESSION_INFO. Quindi, richiamare la funzionecreateJWT()per rigenerare il JWT, utilizzando le informazioni sulla sessione aggiornate per popolare la richiestauser_payload.Nel nostro esempio, l'autenticazione viene simulata con un semplice clic del pulsante. Lo stesso pulsante simula anche la disconnessione eliminando 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
subcontinuerà ad essere utilizzato per tracciare il cliente per scopi di fatturazione, ma ora l'ID utente reale del cliente viene memorizzato separatamente nel payload utente. -
Nelle tue azioni, puoi ora 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 di lavoro completo, vedi l'esempio Abilitazione della sicurezza per la chat web watsonx Assistant.
Se ti viene richiesto di rispettare i requisiti GDPR, potresti dover archiviare in modo permanente tutti gli ID utente anonimi generati, specialmente per gli utenti anonimi che successivamente accedono con le credenziali dell'utente. La memorizzazione di questi ID utente consente di eliminare in un secondo momento tutti i dati associati a un singolo cliente, se richiesto.