Playground

Integre em três passos, agora

O seu servidor cria a sessão, a sua página monta o widget e o seu servidor recebe o webhook assinado. Cada passo roda de verdade no ambiente de testes e mostra o código que você escreve e o que você recebe. O titular é de teste: nenhum dado seu é pedido e nenhuma câmera é aberta. As receitas completas de cada jornada estão na documentação.

O caso

Escolher o caso muda só o flow_id do passo 1 e o desfecho que chega no passo 3.

A jornada

    O desfecho que chega no passo 3

      A linguagem do código

      1. Passo 1 | No seu servidor, com a chave secreta, agora

        Seu servidor cria a sessão

        A chave secreta fica no seu servidor. O reference_id é a chave de idempotência: repetir o pedido com o mesmo valor, enquanto a sessão vive, devolve a mesma sessão em vez de criar outra. Da resposta, só o id vai para a sua página.

      2. Passo 2 | Na sua página, sem segredo, a seguir

        Sua página monta o widget

        O id da sessão é a única coisa que vai ao navegador. Uma linha monta o widget no contêiner, e ele conduz o titular até o fim.

        A sua página
        <!-- Na SUA pagina. Nenhum segredo aqui: so o id da sessao que o seu servidor recebeu. -->
        <div id="identidade"></div>
        <script
          src="https://api.unifokal.com/dist/widget.global.js"
          data-session="vs_..."
          data-container="#identidade"
          crossorigin="anonymous"
        ></script>
      3. Passo 3 | No seu servidor, no seu endpoint, a seguir

        Seu servidor recebe o webhook

        A decisão chega ao seu endpoint num POST assinado. Confira a assinatura antes de ler o corpo: o desfecho que vale é este, nunca o do navegador.

        O seu endpoint confere a assinatura
        #!/bin/sh
        # Na sua maquina: confere se o segredo cadastrado assinou a entrega. E diagnostico; em producao
        # a conferencia roda no servidor, em Node ou Python. corpo-recebido.json guarda os BYTES CRUS.
        HEADER='<o valor do X-IDSAAS-Signature que chegou>'
        T=$(printf '%s' "$HEADER" | tr ',' '\n' | sed -n 's/^t=//p')
        ESPERADO=$({ printf '%s.' "$T"; cat corpo-recebido.json; } \
          | openssl dgst -sha256 -hmac "$UNIFOKAL_WEBHOOK_SECRET" -r | cut -d' ' -f1)
        
        # Compara sob um HMAC de chave efemera: o tempo do '=' nao ensina nada sobre a assinatura.
        CHAVE=$(openssl rand -hex 32)
        mascara() { printf '%s' "$1" | openssl dgst -sha256 -hmac "$CHAVE" -r | cut -d' ' -f1; }
        for V1 in $(printf '%s' "$HEADER" | tr ',' '\n' | sed -n 's/^v1=//p'); do
          [ "$(mascara "$V1")" = "$(mascara "$ESPERADO")" ] && echo "assinatura confere" && exit 0
        done
        echo "assinatura NAO confere"; exit 1