Skip to content

Integração Web

Guia para integrar o SDK de digitais em aplicações web.

Opção 1: Usar a API diretamente

A forma mais simples é enviar imagens via fetch para a API.

typescript
async function processFingerprint(imageFile: File) {
  const formData = new FormData();
  formData.append("file", imageFile);

  const response = await fetch("https://sdk-demo.valid.ia.br/api/process", {
    method: "POST",
    body: formData,
  });

  const result = await response.json();

  if (result.success) {
    // result.image_base64 contém a imagem processada em PNG/base64
    const imgSrc = `data:image/png;base64,${result.image_base64}`;
    // result.quality_score contém o score (0-100)
    // result.quality contém métricas detalhadas
  } else {
    // result.error contém a mensagem de erro
  }
}

Opção 2: Com preview de posicionamento

Para guiar o usuário em tempo real, use o pacote @valid/finger-preview.

Setup

html
<!-- Carregar opencv.js (necessário para detecção de pele) -->
<script src="https://docs.opencv.org/4.x/opencv.js" async></script>
typescript
import { FingerPreview } from "@valid/finger-preview";

const video = document.querySelector("video");
const canvas = document.querySelector("canvas");

// Iniciar câmera
const stream = await navigator.mediaDevices.getUserMedia({
  video: { facingMode: "environment", width: 640, height: 480 },
});
video.srcObject = stream;

// Iniciar preview
const preview = new FingerPreview(video, canvas, {
  guideColor: "#00ff88",
  targetFps: 15,
}, {
  onMessage: (type, text) => {
    // type: "position" | "closer" | "hold" | "ready"
    document.getElementById("message").textContent = text;
  },
  onReady: () => {
    // opencv.js carregou, preview ativo
  },
});

preview.start();

// Quando quiser capturar
const blob = captureVideoFrame(video);
preview.stop();
await processFingerprint(blob);

Fluxo Recomendado

1. Abrir câmera (traseira preferível)
2. Mostrar preview com guia de posicionamento
3. Aguardar mensagem "ready" (dedo posicionado corretamente)
4. Capturar frame
5. Enviar para API
6. Mostrar resultado + métricas de qualidade
7. Se qualidade baixa, permitir nova captura

React — Exemplo Completo

tsx
import { useState } from "react";

function FingerprintCapture() {
  const [result, setResult] = useState(null);
  const [loading, setLoading] = useState(false);

  const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0];
    if (!file) return;

    setLoading(true);
    try {
      const formData = new FormData();
      formData.append("file", file);

      const res = await fetch("/api/process", {
        method: "POST",
        body: formData,
      });
      setResult(await res.json());
    } catch (err) {
      console.error("Erro:", err);
    } finally {
      setLoading(false);
    }
  };

  return (
    <div>
      <input type="file" accept="image/*" onChange={handleFile} />
      {loading && <p>Processando...</p>}
      {result?.success && (
        <div>
          <img src={`data:image/png;base64,${result.image_base64}`} />
          <p>Qualidade: {result.quality_score.toFixed(1)}/100</p>
        </div>
      )}
      {result?.error && <p style={{ color: "red" }}>{result.error}</p>}
    </div>
  );
}

Dicas

  • Câmera traseira dá melhores resultados que a frontal
  • Iluminação é crucial — evitar sombras fortes e contraluz
  • Distância ideal: dedo ocupando ~30-50% do frame
  • Foco automático geralmente funciona bem, mas foco manual em macro é ideal
  • O preview JS/WASM roda ~15fps e consome pouca CPU

CORS

Se a API está em um domínio diferente, configure FINGERPRINT_CORS_ORIGINS:

bash
FINGERPRINT_CORS_ORIGINS=["https://seu-app.com"]

Valid S.A. - Soluções de Identidade Digital