ByDomuDevelopers

Identidad verificada del widget

Firma en tu servidor quién está chateando: cómo se calcula, qué cambia y cómo probarlo.

GuíaHMAC-SHA256Del lado del servidor

Genera el secreto

En Configuración › Chat web (widget) › Identidad verificada › Generar secreto. Se muestra una sola vez: guárdalo en una variable de entorno de tu servidor (BYDOMU_WIDGET_SECRET). Si lo rotas, el anterior deja de servir al instante y, hasta que actualices el servidor, tus usuarios chatean como visitantes anónimos.

Calcula userHash en tu servidor

userHash = HMAC-SHA256(secreto, userId) en hexadecimal. Usa un id interno estable, no el correo ni algo que la persona pueda cambiar. Sin userId se firma el correo, pero entonces el correo pasa a ser la identidad: úsalo solo si en tu web está verificado.

import { createHmac } from "node:crypto";

// Tu backend: el usuario ya inició sesión en tu web.
app.get("/api/bydomu-identity", requireLogin, (req, res) => {
  const userId = String(req.user.id);              // estable: nunca cambia
  const userHash = createHmac("sha256", process.env.BYDOMU_WIDGET_SECRET)
    .update(userId)
    .digest("hex");
  res.json({ userId, email: req.user.email, name: req.user.name, userHash });
});

Pásala a la página

El navegador solo recibe el resultado, nunca el secreto. Llama a boot cuando la persona inicia sesión y a shutdown cuando la cierra, para que el siguiente usuario del mismo navegador no herede la conversación.

HTML
<script>
  // Después del código de instalación del widget.
  fetch("/api/bydomu-identity", { credentials: "include" })
    .then((r) => (r.ok ? r.json() : null))
    .then((identity) => identity && Domu("boot", identity));
</script>

<!-- Al cerrar sesión en tu web -->
<script>Domu("shutdown")</script>

Qué cambia con una firma válida

  • Con userId, el contacto se busca por ese id (su «id externo»), no por correo: el correo no va firmado y nadie puede reclamar el contacto de otro escribiendo su correo. Si no existe, se crea con origen WEBSITE.
  • La conversación sigue a la persona entre dispositivos, y los atributos y eventos que la página mandó antes de iniciar sesión pasan a su contacto.
  • Noa ve al contacto verificado durante 24 horas, y los atributos que mandes con update cuentan como verificados (uno sin firma nunca pisa uno verificado).
  • Si la firma no coincide o no hay secreto, el chat sigue anónimo y el visitante no ve ningún error.

Pruébalo

Compara lo que calcula tu servidor con openssl. Luego inicia sesión en tu web, escribe en el chat y abre la conversación en ByDomu: el contacto debe ser el de tu usuario, no un visitante nuevo.

Shell
# Debe dar lo mismo que tu servidor (hex en minúsculas)
printf '%s' 'u_123' | openssl dgst -sha256 -hmac "$BYDOMU_WIDGET_SECRET"

# Con el secreto «secreto_de_prueba» y userId «u_123»:
# 957e886ac44041d2fe2094ad46f8eade58ef58cd593a62e51d76a7f652d9e4ce

La API JavaScript completa del widget