For the complete documentation index, see llms.txt. This page is also available as Markdown.

Eventos e Mensagens

Uma vez que o Hub foi aberto em modo Popup, toda a troca de informações entre o Hub e a sua aplicação é feita através da API nativa do navegador postMessage.

Sua aplicação deve registrar um ouvinte para o evento message do objeto window, filtrar pela origem correta e tratar os dados retornados.

lightbulb-on

Fluxo Manual Automatizado Opcional A captura do OTP via eventos Javascript é opcional e recomendada para uma integração fluida. Contudo, se seu fluxo for manual, o usuário pode simplesmente copiar o código OTP da tela do Hub e digitá-lo no formulário do seu site. Para este caso, não é obrigatório implementar os listeners de eventos.

Eventos Retornados

O Certifier Auth Hub dispara os seguintes eventos estruturados em formato JSON:

Tipo do Evento (type)
Quando ocorre
Parâmetros retornados

signature_session_otp

Autenticação concluída com sucesso e código OTP gerado.

  • otp: Código de uso único gerado.

  • cpf_cnpj: Documento do titular do certificado.

  • session_id: ID UUID da sessão.

  • certifier_id: Código ID da certificadora.

  • certifier_name: Nome amigável do provedor.

  • certifier_image: URL do logotipo da certificadora.

  • expires_at: Timestamp UNIX de expiração do OTP

signature_session_error

Falha ou erro técnico na autenticação.

  • message: Descrição amigável do erro ocorrido.

signature_session_cancel

O usuário cancelou ativamente a operação ou fechou o Hub.

  • message: Motivo do cancelamento (ex: popup fechado).

Exemplo de Código Completo para Capturar Eventos

Veja a seguir como implementar o listener e filtrar com segurança a origem das mensagens recebidas para evitar ataques de injeção de mensagens:

// Exemplo de captura de eventos do Certifier Auth Hub

// Domínio de produção oficial
const appUrl = 'https://certifierauthhub.vaultid.com.br';

window.addEventListener('message', (event) => {
  // 1. Filtrar eventos apenas do domínio oficial do Hub (exige whitelist prévia na Soluti)
  if (event.origin !== appUrl) {
    return;
  }

  const data = event.data;
  
  // 2. Verificar se o evento pertence à estrutura de dados do Hub
  if (data && data.type) {
    console.log(`[Hub Event] ${data.type}`, data);

    // Limpa o polling de fechamento do popup se ele ainda estiver ativo
    if (window.authPollTimer) {
      clearInterval(window.authPollTimer);
      window.authPollTimer = null;
    }

    switch (data.type) {
      case 'signature_session_otp':
        console.log('Sucesso! OTP Gerado:', data.otp);
        console.log('CPF/CNPJ do titular:', data.cpf_cnpj);
        console.log('ID da Sessão:', data.session_id);
        console.log('ID do Provedor:', data.certifier_id);
        console.log('Nome do Provedor:', data.certifier_name);
        console.log('Logotipo do Provedor:', data.certifier_image);
        console.log('Expiração do OTP (UNIX):', data.expires_at);
        
        // TODO: Enviar o OTP e o ID da sessão ao seu backend para assinar o documento
        
        // Fechar a janela do popup após o sucesso
        if (window.authPopupWindow && !window.authPopupWindow.closed) {
          window.authPopupWindow.close();
        }
        break;

      case 'signature_session_error':
        console.error('Ocorreu um erro no Hub:', data.message);
        alert(`Erro na autenticação: ${data.message}`);
        
        // Fechar a janela do popup devido à falha
        if (window.authPopupWindow && !window.authPopupWindow.closed) {
          window.authPopupWindow.close();
        }
        break;

      case 'signature_session_cancel':
        console.warn('Cancelado pelo usuário:', data.message);
        
        // Limpar referências do popup
        window.authPopupWindow = null;
        break;
    }
  }
});
lightbulb-on

Dica de Segurança: Em produção, certifique-se de validar a propriedade event.origin comparando-a estritamente com o domínio oficial de produção (https://certifierauthhub.vaultid.com.br), rejeitando mensagens de qualquer outra origem.

Last updated

Was this helpful?