Identidad del visitante
Si tu sitio sabe quién está logueado, podés pasarle al widget de chat-web su correo, nombre y un userId. Mosend salta el formulario de precapture, enlaza la sesión con el contacto correspondiente y muestra el historial previo del usuario aunque vuelva en otro navegador.
¿Por qué firmar la identidad?
Sin firma, cualquier persona que abra DevTools en tu sitio puede llamar a Mosend('identify', { email: 'ceo@otraempresa.com' }) y hacerse pasar por otra persona. Para evitarlo, el navegador manda el dato (email/userId) más un HMAC que solo tu servidor puede calcular. Mosend verifica el HMAC con el secreto compartido — si no coincide, rechaza la identidad.
El secreto vive solo en tu servidor (variable de entorno) y en Mosend (encriptado); nunca lo expones al navegador.
Generar el secreto del canal
- Entrá al dashboard de Mosend → Settings → Web Chat → editar tu canal → pestaña Identidad.
- Click en Generar secreto. Lo verás una sola vez: copialo y guardalo en tu backend como variable de entorno (ej.
MOSEND_IDENTITY_SECRET). - Cuando ya verificaste que tu integración funciona, activá Exigir verificación HMAC. A partir de ese momento, identidades sin firma válida se rechazan con 401.
Rotar el secreto invalida el anterior — re-deployá tu integración con el nuevo.
Server-side: calcular el HMAC
Firmás el userId (o el email si no tenés userId) con HMAC-SHA256 y le pasás el hex al cliente para que lo embeba en la página:
Node.js
import crypto from 'crypto';
const SECRET = process.env.MOSEND_IDENTITY_SECRET!;
function mosendIdentityHash(userId: string): string {
return crypto.createHmac('sha256', SECRET).update(userId).digest('hex');
}
// En el handler de tu página/SSR:
const hash = mosendIdentityHash(String(currentUser.id));
// → pasalo al template para que window.Mosend lo usePHP
<?php
$secret = getenv('MOSEND_IDENTITY_SECRET');
$hash = hash_hmac('sha256', (string) $user->id, $secret);
?>Python
import hmac, hashlib, os
SECRET = os.environ["MOSEND_IDENTITY_SECRET"].encode()
def mosend_identity_hash(user_id: str) -> str:
return hmac.new(SECRET, user_id.encode(), hashlib.sha256).hexdigest()Si no tenés userId, firmá el email con el mismo método. Mosend verifica con el primer dato disponible entre userId y email.
Frontend: usar window.Mosend
Hay dos formas — usá la que mejor encaje con tu stack.
Sitios server-rendered (HTML estático)
Pasá la identidad como data-attrs del script:
<script
src="https://mosend.dev/chat.js"
data-channel="wch_..."
data-user-id="42"
data-user-email="jane@ejemplo.com"
data-user-name="Jane Doe"
data-user-hash="<%= mosendIdentityHash('42') %>">
</script>SPAs / login dinámico
Llamá a la API después del login:
// Después del login (idealmente con el hash inyectado desde tu backend):
window.Mosend('identify', {
userId: '42',
email: 'jane@ejemplo.com',
name: 'Jane Doe',
hash: '<HMAC_HEX>', // opcional pero recomendado
attributes: { plan: 'pro' }, // opcional, queda en el contact
});
// Al logout:
window.Mosend('shutdown');Si tu sitio carga el chat más tarde de lo normal, podés pre-instalar un stub para bufferear llamadas tempranas:
<script>
window.Mosend = window.Mosend || function () {
(window.Mosend.q = window.Mosend.q || []).push(arguments);
};
</script>Qué hace Mosend con la identidad
- Busca un Contact con ese email en tu organización. Si existe, lo reutiliza (mismo usuario en otro navegador → mismo hilo).
- Si no existe, lo crea con el email + nombre que pasaste.
- Si el visitor ya había escrito como anónimo en este mismo navegador, migra el historial al contact identificado (no perdés conversaciones).
- Marca
identityVerified: trueen el visitor cuando el HMAC verifica;falsecuando no había firma y el canal lo permite.
Errores comunes
401 — Identidad inválida o sin firma: el canal tiene Exigir verificación HMAC activado pero elhashfalta o no coincide. Revisá que estés firmando eluserId(mismo string exacto que pasás enidentify) con el secreto que generaste.- El widget pide nombre/email igual: probablemente el snippet no recibió la identidad — chequeá que
window.Mosendexista cuando llamásidentify(el script de chat.js debe haber cargado). - El usuario ve historial de otra persona: rara vez ocurre — significa que ambos compartieron el mismo
visitorIden localStorage (mismo navegador, no se llamóshutdownal logout). Llamá siempre aMosend('shutdown')al logout para limpiar.