Tutorial: Autenticación de un usuario en mitad de una sesión

Si tiene activada la seguridad del chat web, debe establecer un ID de usuario para el cliente al inicio de la sesión como parte del token web JSON (JWT) que utiliza para firmar los mensajes. Para los usuarios que no están autenticados, se trata normalmente de un ID generado, y no se puede cambiar una vez creado el JWT. Sin embargo, puede utilizar una variable privada para autenticar a un usuario más adelante en la sesión.

Con la seguridad del chat web activada, el ID de usuario asociado a cada mensaje se basa en la declaración " sub " de la carga útil JWT. Este valor debe establecerse al inicio de la sesión, cuando se crea el JWT, y no puede cambiarse durante la vida de la sesión. En el caso de los usuarios no autenticados (anónimos), se suele utilizar un ID generado, guardado en una cookie, para garantizar que cada cliente único se contabiliza una sola vez a efectos de facturación.

Sin embargo, es posible que desee que sus clientes puedan autenticarse en mitad de una sesión (por ejemplo, para completar una acción que actualice la información de la cuenta del usuario). Dado que el ID de usuario generado en la solicitud " sub " no puede cambiarse, se necesita otra forma de autenticar al usuario de forma segura. Puede hacerlo almacenando el ID de usuario autenticado real del cliente como una variable privada en la carga útil de usuario del JWT. (Podrías almacenar el ID de usuario en una variable de contexto ordinaria, pero esto no sería seguro, porque tales variables pueden ser modificadas)

Para obtener una versión completa y funcional del ejemplo descrito en este tutorial, consulte Habilitación de la seguridad para el chat web del asistente de IA (complejo).

Para una versión de chat web con códigos mínimos para habilitar la seguridad, que no tiene cargas útiles cifradas ni cambios de usuario durante la sesión, consulte Habilitación de la seguridad para el chat web del asistente de IA (simple).

El ejemplo de este tutorial, 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 luego autenticar al usuario durante la sesión.

  1. Cree una función llamada ' getOrSetAnonymousID() ' que genere un ID de usuario anónimo único 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, el mismo cliente podría contabilizarse como varios usuarios diferentes durante el mismo periodo de facturación. (Esto puede seguir ocurriendo si el mismo usuario borra 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;
}
  1. En la función que utilices para crear un JWT, utiliza el ID anónimo devuelto por la función ' getOrSetAnonymousID() ' como valor de la declaración ' sub. Establece el valor del ID de usuario que se utilizará para identificar de forma exclusiva al cliente a efectos de facturación.

    Además, recupere cualquier valor de la cookie ' SESSION_INFO ', que utilizaremos para almacenar la información de inicio de sesión autenticada. Si existe un valor, guárdelo en la declaración privada ' user_payload del JWT. (Si el usuario aún no se ha autenticado, esta cookie aún 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;
}
  1. Crear una función para manejar la autenticación de usuario. En nuestro ejemplo, estamos utilizando una simple función ' authenticate() ' 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. Almacenar la información del usuario en la 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');
}
  1. Cuando un usuario inicia sesión, llama a la función ' authenticate() ' para almacenar la información del usuario en la cookie ' SESSION_INFO. A continuación, llame a la función " createJWT() " para regenerar el JWT, utilizando la información de sesión actualizada para rellenar la solicitud " user_payload.

    En nuestro ejemplo, la autenticación se simula con un simple clic en un botón. El mismo botón también simula el cierre de sesión mediante la eliminación de 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 identificador anónimo de la declaración " sub " seguirá utilizándose para realizar el seguimiento del cliente a efectos de facturación, pero ahora el identificador de usuario real del cliente se almacena por separado en la carga útil del usuario.

  2. En tus acciones, ahora puedes acceder al ID de usuario real del cliente haciendo referencia a la variable contextual privada ' user_payload:

${system_integrations.chat.private.user_payload}.custom_user_id

Para obtener el código de trabajo completo, consulte el ejemplo Activación de la seguridad para el chat web del asistente de IA.

Si está obligado a cumplir los requisitos del GDPR, puede que necesite almacenar de forma persistente cualquier ID de usuario anónimo generado, especialmente para usuarios anónimos que posteriormente inicien sesión con credenciales de usuario. El almacenamiento de estos identificadores de usuario le permite eliminar posteriormente todos los datos asociados a un cliente individual si así se le solicita.