yocol.

Integración · Identidad de usuarios

Cada reporte, con su usuario.

Inicia anónimo e identifica al usuario cuando tu aplicación complete el login. Sólo necesitas un ID estable; nombre, email y metadata son opcionales.

1. Configura tu ambiente

En tu asistente, pide configurar la identidad con yocol_configure_identity. Indica el proyecto, ambiente y un issuer estable que identifique tu backend. Genera un par Ed25519 en tu servidor y registra únicamente la clave pública PEM. Conserva la privada en el gestor de secretos de tu aplicación.

Configura primero las URLs con yocol_configure_environment y usa la key del ambiente que entrega yocol_prepare_integration. Las apps sin login pueden omitir la configuración de identidad.

2. Firma la identidad desde tu backend

Crea un endpoint autenticado, por ejemplo POST /api/yocol/identity. Valida la sesión y las protecciones de origen/CSRF de tu aplicación. Firma una aserción dedicada de hasta cinco minutos; no envíes el token de login de tu aplicación a Yocol.

// Sólo en tu backend. Autentica la petición con tu sesión existente.
import { sign } from 'node:crypto';

const user = await requireAuthenticatedUser(request);
const now = Math.floor(Date.now() / 1000);
const encode = value => Buffer.from(JSON.stringify(value)).toString('base64url');
const payload = {
  iss: process.env.YOCOL_IDENTITY_ISSUER,
  aud: 'yocol:widget',
  sub: user.id,                    // ID estable de tu base de datos o proveedor
  projectId: process.env.YOCOL_PROJECT_ID,
  environment: process.env.APP_ENV, // dev, stage o prod
  iat: now, exp: now + 300,
  user: { id: user.id },           // name, email y metadata son opcionales
};
const data = encode({ alg: 'EdDSA', typ: 'JWT' }) + '.' + encode(payload);
const identityToken = data + '.' + sign(null, Buffer.from(data),
  process.env.YOCOL_IDENTITY_PRIVATE_KEY).toString('base64url');
// Devuelve { identityToken } con Cache-Control: no-store.
// requireAuthenticatedUser es la función de autenticación de TU aplicación.
// Nunca aceptes user.id, issuer, proyecto o ambiente del body del navegador.

Los datos opcionales deben ir dentro de user en el payload firmado. Metadata admite hasta 20 campos de texto, número, booleano o null, con un total máximo de 1024 bytes. No concede roles ni permisos en Yocol.

3. Conecta login y logout

// El loader carga el SDK de forma asíncrona.
const sdk = window.Yocol ?? await new Promise(resolve => {
  window.addEventListener('yocol:sdk-ready', () => resolve(window.Yocol), { once: true });
});
const yocol = sdk.init({ projectKey: 'TU_KEY_PUBLICA_DEL_AMBIENTE' });
await yocol.ready; // Funciona sin login: sesión anónima.

function identifyCurrentUser() {
  return yocol.identify({
    getIdentityToken: async signal => {
      const response = await fetch('/api/yocol/identity', {
        method: 'POST', credentials: 'same-origin', cache: 'no-store', signal,
      });
      if (!response.ok) throw new Error('No se pudo verificar la sesión');
      const { identityToken } = await response.json();
      return identityToken;
    },
  });
}

// Después de autenticar al usuario en tu aplicación:
await identifyCurrentUser();

// Al cerrar sesión o ANTES de cambiar de cuenta:
try {
  await yocol.reset(); // Cancela identificación pendiente y limpia el widget.
} finally {
  // Completa aquí el logout de tu aplicación, incluso si no hay red.
}

// La sesión verificada dura una hora. Renueva desde tu backend autenticado.
yocol.onAction(({ type }) => {
  if (type === 'identity.expired') {
    identifyCurrentUser().catch(() => yocol.reset().catch(() => {}));
  }
});

Si ya tienes la aserción al inicializar, usa Yocol.init({ projectKey, identityToken }) y espera ready. Si ya tienes una aserción puedes usar directamente await yocol.identify({ identityToken }). El proveedor getIdentityToken se cancela al salir o cambiar de cuenta. Un error de identificación rechaza la promesa; no confirma al usuario ni restaura la cuenta anterior.

Conecta reset al logout en todas las pestañas mediante el mecanismo de sesión de tu aplicación. Reset limpia el widget local; no cierra el login de tu app ni revoca tokens ya emitidos en otros dispositivos. Las sesiones emitidas vencen en un máximo de una hora.

4. Prueba el recorrido completo en dev

  1. Envía un reporte anónimo.
  2. Inicia sesión como A, espera identify y envía otro reporte.
  3. Revisa en Yocol el ID, ambiente y metadata del segundo reporte. El primero sigue anónimo.
  4. Ejecuta reset y entra como B: no debe aparecer el historial de A.
  5. Prueba una firma inválida y el vencimiento de sesión: ninguna debe confirmar una identidad.

La identidad se separa por proyecto, ambiente, issuer e ID. Los reportes guardan una copia de los datos verificados al enviarse; cambiar después el perfil no reescribe reportes anteriores.