const config = { // ... outras configurações onFailure: (error) => { switch (error.type) { case 'CAMERA_PERMISSION_DENIED': mostrarMensagem( 'Por favor, permita o acesso à câmera nas configurações do navegador.' ); break; case 'CAMERA_INJECTION_DETECTED': mostrarMensagem( 'Detectamos um problema com a câmera. Por favor, desative softwares de câmera virtual.' ); break; case 'NETWORK_ERROR': mostrarMensagem( 'Erro de conexão. Verifique sua internet e tente novamente.' ); break; case 'SESSION_FAILED': mostrarMensagem( 'Não foi possível iniciar a sessão. Tente novamente em alguns instantes.' ); break; case 'LIVENESS_VALIDATION_FAILED': mostrarMensagem( 'A verificação de vivacidade não foi aprovada. Tente novamente seguindo as instruções.' ); break; case 'CAPTURE_FAILED': mostrarMensagem( 'Falha na captura: ' + (error.failureReason || 'Tente novamente') ); break; case 'USER_CANCELLED': mostrarMensagem('Verificação cancelada pelo usuário.'); break; default: mostrarMensagem('Ocorreu um erro inesperado. Tente novamente.'); console.error('Erro:', error); } },};
Converta erros técnicos em mensagens compreensíveis para o usuário:
function getMensagemAmigavel(error) { const mensagens = { CAMERA_PERMISSION_DENIED: { titulo: 'Acesso à Câmera Necessário', mensagem: 'Para continuar, permita o acesso à câmera nas configurações do seu navegador.', acao: 'Verificar Permissões', }, CAMERA_INJECTION_DETECTED: { titulo: 'Câmera Virtual Detectada', mensagem: 'Detectamos um software de câmera virtual. Por favor, desative-o e use sua câmera real.', acao: 'Tentar Novamente', }, NETWORK_ERROR: { titulo: 'Problema de Conexão', mensagem: 'Não foi possível conectar ao servidor. Verifique sua internet.', acao: 'Tentar Novamente', }, SESSION_FAILED: { titulo: 'Falha na Sessão', mensagem: 'A sessão expirou ou não pôde ser criada. Por favor, inicie novamente.', acao: 'Reiniciar', }, LIVENESS_VALIDATION_FAILED: { titulo: 'Verificação Não Aprovada', mensagem: 'A verificação de vivacidade não foi aprovada. Siga as instruções na tela e tente novamente.', acao: 'Tentar Novamente', }, CAPTURE_FAILED: { titulo: 'Falha na Captura', mensagem: 'Não conseguimos capturar sua biometria. Tente novamente com boa iluminação.', acao: 'Tentar Novamente', }, SUBMISSION_FAILED: { titulo: 'Falha no Envio', mensagem: 'Não foi possível enviar os dados. Verifique sua conexão e tente novamente.', acao: 'Tentar Novamente', }, USER_CANCELLED: { titulo: 'Verificação Cancelada', mensagem: 'Você cancelou a verificação.', acao: 'Reiniciar', }, }; return ( mensagens[error.type] || { titulo: 'Erro Inesperado', mensagem: 'Ocorreu um problema. Por favor, tente novamente.', acao: 'Tentar Novamente', } );}
Comunicação com a API de liveness (URLs gerenciadas pelo SDK)
connect-src
https://*.facetec.com
Recursos do motor FaceTec (quando utilizado)
img-src
blob:data:
Imagens capturadas pela câmera e assets em base64
media-src
blob:
Stream de vídeo da câmera
worker-src
blob:
Web Workers usados internamente pelo SDK
As origens exatas podem variar dependendo do motor biométrico selecionado (FaceSDK,
FaceTec ou Innovatrics). Em caso de erros de CSP no console, adicione as origens
bloqueadas à sua política.
Carregue o CEK antes do usuário iniciar a verificação para evitar delays.
2
Container com dimensões fixas
Defina dimensões fixas no container para evitar reflows durante a
renderização.
3
Cleanup na API Avançada
Se estiver usando a API Avançada (init / startLivenessCheck / teardown),
sempre chame teardown() em um bloco finally. Na API Simples (run()),
o cleanup é automático.
// Cleanup automático, sem necessidade de teardownconst hub = ValidHub.createHub();try { const result = await hub.run(config); // processar resultado} catch (error) { // tratar erro}