Habilitación de la seguridad de conversación web
Para habilitar la seguridad de conversación web, debe realizar cambios en el código del servidor de aplicaciones web y en el script de inclusión de conversación web, así como en los valores de integración de conversación web.
Para obtener una implementación de referencia completa de NodeJS que habilita la seguridad, consulte Habilitación de la seguridad para la conversación web de watsonx Assistant.
Antes de empezar
Antes de habilitar la seguridad, debe crear un par de claves pública/privada RS256. Puede utilizar una herramienta como OpenSSL o PuTTYgen.
Por ejemplo, para crear el par de claves en un indicador de mandatos utilizando OpenSSL, utilizaría el mandato openssl genrsa -out key.pem 2048.
Guarde el par de claves generado en una ubicación segura.
Asegúrese de que el código del servidor sólo pueda acceder a estas claves. Nunca los pase a un navegador de cliente a través de su sitio web.
Generación de un JWT
Para utilizar la seguridad de conversación web, debe configurar la conversación web en el sitio web para enviar una señal web JSON (JWT) con cada mensaje al asistente. El JWT se utiliza para verificar el origen de los mensajes enviados desde el sitio web y, opcionalmente, para transportar datos cifrados adicionales. Su sitio web tendrá que ser capaz de generar un nuevo JWT al principio de cada sesión, y también cuando un JWT existente caduca.
No codifique un JWT en el código de su sitio web ni comparta JWT entre usuarios.
En el servidor, implemente una función que genere y devuelva una señal web JSON (JWT) firmada con la clave privada. Utilizará esta señal para verificar el origen de los mensajes enviados desde el sitio web y, opcionalmente, para transportar datos cifrados adicionales.
La mayoría de lenguajes de programación ofrecen bibliotecas de JWT que puede utilizar para generar una señal. Para validar las JWT firmadas, la integración de conversación web utiliza la biblioteca jsonwebtoken con el algoritmo RS256.
La carga útil de JWT debe especificar las siguientes reclamaciones:
-
sub: ID de usuario exclusivo que identifica al cliente que está interactuando con la conversación web. Puede ser un identificador exclusivo generado (para usuarios anónimos) o un ID de usuario autenticado. Para obtener más información sobre cómo se utiliza el valorsub, consulte Autenticación de usuarios en la conversación web.Para garantizar la seguridad, el JWT debe ser específico de cada usuario. Utilice la información de inicio de sesión autenticado del usuario o un ID generado exclusivo. No reutilice el mismo JWT, o el mismo valor
sub, para más de un usuario. -
exp: la hora de caducidad después de la cual el JWT ya no es válido. Muchas bibliotecas JWT establecen este valor automáticamente. Establezca una reclamaciónexpde corta duración (por ejemplo,1h).No cree un JWT sin una reclamación
exp. Aunque esta reclamación no es formalmente necesaria, omitirla representa una exposición de seguridad porque cualquier persona con acceso a la JWT podría copiarla y utilizarla más adelante para acceder a su asistente. El establecimiento de un tiempo de caducidad limita esta exposición.
El siguiente ejemplo de JavaScript muestra cómo puede generar un JWT utilizando la biblioteca jsonwebtoken :
// Sample NodeJS code on your server.
const jwt = require('jsonwebtoken');
// Returns a signed JWT signed with the RS256 algorithm.
function createJWT() {
const payload = {
sub: 'some-user-id', // Identifies user for billing purposes
};
// The "expiresIn" option adds an "exp" claim to the payload.
return jwt.sign(payload,
process.env.YOUR_PRIVATE_RSA_KEY,
{ algorithm: 'RS256', expiresIn: '1h' });
}
Configuración de la conversación web para incluir JWT
Ahora que ha implementado una función para generar un JWT firmado, debe actualizar la instancia de conversación web para incluir el JWT firmado con cada mensaje que envíe. Después de habilitar la seguridad de conversación web, los mensajes que no estén firmados con la clave privada adecuada se rechazarán.
En el HTML del sitio web, actualice el script de inclusión de conversación web para especificar un nuevo JWT al principio de cada sesión, y también siempre que caduque el JWT existente. La forma más sencilla de hacerlo es suscribirse al suceso
identityTokenExpired y generar un nuevo JWT cuando se recibe dicho suceso. El suceso
identityTokenExpired se activa en las dos situaciones siguientes:
-
Al principio de una nueva sesión, si no se ha proporcionado ningún JWT utilizando la opción de configuración
identityToken. -
Cuando caduca el JWT especificado anteriormente.
En el manejador de sucesos onLoad, utilice el método de instancia on() para
suscribirse al suceso identityTokenExpired.
En la devolución de llamada, llame a la función del servidor que ha implementado para generar un nuevo JWT. A continuación, utilice el parámetro identityToken del suceso para especificar el nuevo JWT, como en este ejemplo:
instance.on({ type: 'identityTokenExpired',
handler: async function(event) {
const jwtFromServer = await fetch('http://example.com:3001/createJWT');
event.identityToken = jwtFromServer;
}});
El nuevo JWT que especifique se envía automáticamente con cada mensaje posterior de la instancia de conversación web en el sitio web (hasta que caduque la señal).
También puede especificar el JWT al principio de la sesión utilizando la propiedad identityToken en el objeto de configuración de conversación web. Sin embargo, seguirá necesitando crear un manejador de eventos para identityTokenExpired,
a menos que esté seguro de que las JWT nunca caducarán durante una sesión.
Actualización de los valores de conversación web
Ahora que ha configurado la conversación web para enviar JWT firmados, puede habilitar la seguridad de la conversación web en los valores de integración de la conversación web.
Después de habilitar la seguridad de conversación web, los mensajes de cualquier origen que no sea la instancia de conversación web (que ha configurado para enviar JWT firmados) se rechazan. Esto significa que la habilitación de la seguridad de conversación web inhabilita el enlace de vista previa compartible, que no envía JWT con mensajes. Para obtener más información sobre el enlace de vista previa, consulte Copia de un enlace para compartir.
Para habilitar la seguridad, siga estos pasos:
-
En la pestaña Seguridad de los valores de integración de conversación web, establezca el conmutador Proteger la conversación web en Activado.
-
En el campo Su clave pública, pegue su clave pública.
watsonx Assistant utiliza la clave pública para verificar que los mensajes entrantes se originan en el sitio web.
El diagrama siguiente muestra el flujo de mensajes entre la conversación web y el asistente cuando la seguridad de conversación web está habilitada:
