Tutorial: Autenticación de un usuario en medio de una sesión
Si tiene habilitada la seguridad de conversación web, debe establecer un ID de usuario para el cliente al principio de la sesión como parte de la señal web JSON (JWT) que utiliza para firmar mensajes. Para los usuarios que no están autenticados, normalmente se trata de un ID generado y no se puede cambiar después de crear el JWT. Sin embargo, puede utilizar una variable privada para autenticar un usuario más adelante en la sesión.
Con la seguridad de conversación web habilitada, el ID de usuario asociado a cada mensaje se basa en la reclamación sub en la carga útil de JWT. Este valor se debe establecer al principio de la sesión, cuando se crea el JWT, y no
se puede cambiar durante la vida de la sesión. Para usuarios no autenticados (anónimos), normalmente utilizaría un ID generado, guardado en una cookie, para asegurarse de que cada cliente exclusivo se cuenta sólo una vez para fines de facturación.
Sin embargo, es posible que desee que los clientes puedan autenticarse en medio de una sesión (por ejemplo, para completar una acción que actualice la información de cuenta del usuario). Puesto que el ID de usuario generado en la reclamación sub no se puede cambiar, necesita otra forma de autenticar el usuario de forma segura. Puede hacerlo almacenando el ID de usuario autenticado real del cliente como una variable privada en la carga útil del usuario del JWT. (Podría almacenar el ID
de usuario en una variable de contexto normal, pero esto no sería seguro, porque estas variables se pueden modificar.)
Para obtener una versión completa y funcional del ejemplo descrito en esta guía de aprendizaje, consulte Habilitación de la seguridad para la conversación web de watsonx Assistant(compleja).
Para una versión de conversación web con códigos mínimos para habilitar la seguridad, que no tiene cargas útiles cifradas y cambios de usuario durante la sesión, consulte Habilitación de la seguridad para la conversación web de watsonx Assistant(simple).
Este ejemplo de esta guía de aprendizaje, que se basa en un servidor Express para Node.js, muestra cómo iniciar una sesión con un ID de usuario anónimo y, a continuación, autenticar el usuario durante la sesión.
-
Cree una función denominada
getOrSetAnonymousID()que genere un ID de usuario anónimo exclusivo para cada cliente y lo almacene en una cookie (o, si la cookie ya existe, utilice el ID de usuario almacenado).Utilice una cookie que dure al menos 45 días. Si no almacena el ID de usuario durante más de 30 días, es posible que el mismo cliente se cuente como varios usuarios diferentes durante el mismo periodo de facturación. (Esto puede suceder si el mismo usuario suprime la cookie o utiliza un navegador diferente.)
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;
}
-
En la función que utilice para crear un JWT, utilice el ID anónimo devuelto por la función
getOrSetAnonymousID()como valor de la reclamaciónsub. Esto establece el valor del ID de usuario que se utilizará para identificar de forma exclusiva al cliente para fines de facturación.Además, recupere cualquier valor de la cookie
SESSION_INFO, que utilizaremos para almacenar información de inicio de sesión autenticada. Si existe un valor, almacénelo en la reclamación privadauser_payloaddel JWT. (Si el usuario todavía no se ha autenticado, esta cookie todavía no existe.)
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;
}
- Cree una función para manejar la autenticación de usuario. En nuestro ejemplo, estamos utilizando una función
authenticate()simple que establece un ID de usuario codificado, pero en una aplicación real el ID de usuario probablemente se recuperaría de una base de datos después de una comprobación de autenticación segura. Almacene la información de usuario en la 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');
}
-
Cuando un usuario inicia sesión, llame a la función
authenticate()para almacenar la información de usuario en la cookieSESSION_INFO. A continuación, llame a la funcióncreateJWT()para volver a generar el JWT, utilizando la información de sesión actualizada para llenar la reclamaciónuser_payload.En nuestro ejemplo, la autenticación se simula con una simple pulsación de botón. El mismo botón también simula el cierre de sesión suprimiendo la 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(); }El ID anónimo de la reclamación
subse seguirá utilizando para realizar un seguimiento del cliente con fines de facturación, pero ahora el ID de usuario real del cliente se almacena por separado en la carga útil del usuario. -
En las acciones, ahora puede acceder al ID de usuario real del cliente haciendo referencia a la variable de contexto privado
user_payload:
${system_integrations.chat.private.user_payload}.custom_user_id
Para ver el código de trabajo completo, consulte el ejemplo de Habilitación de la seguridad para watsonx Assistant conversación web.
Si es necesario que cumpla los requisitos de GDPR, es posible que tenga que almacenar de forma persistente los ID de usuario anónimos generados, especialmente para los usuarios anónimos que posteriormente inician sesión con credenciales de usuario. El almacenamiento de estos ID de usuario le permite suprimir posteriormente todos los datos asociados con un cliente individual si se le solicita.