> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/caf-sdk/caf-sdk-pt-br/web-javascript/getting-started/face-liveness-and-face-authenticator.md).

# Face Liveness e Face Authenticator

## Vivacidade facial e autenticador facial

O SDK Web CafFaceLiveness fornece detecção de vivacidade facial com suporte a vários provedores, cada um oferecendo recursos e capacidades diferentes. O SDK direciona automaticamente para o provedor apropriado com base na configuração do seu token mobile.

### Provedores compatíveis

| Provedor    | Descrição                                               |
| ----------- | ------------------------------------------------------- |
| **Caf**     | Validação de vivacidade em 2D usando as soluções da Caf |
| **FaceTec** | Tecnologia de detecção de vivacidade 2D da FaceTec      |
| **iProov**  | Detecção de vivacidade com as tecnologias GPA e LA      |
| **Payface** | Tecnologia de verificação facial da Payface             |

### Início rápido

#### 1. Instalação

Inclua o script do SDK no seu arquivo HTML:

```html
<script src="https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.17.2/caf-face-liveness_0.17.2.umd.js"></script>
```

Ou inclua-o via JavaScript:

```javascript
const sdkScript = document.createElement("script");
sdkScript.src =
  "https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.17.2/caf-face-liveness_0.17.2.umd.js";
document.body.appendChild(sdkScript);
```

{% hint style="info" %}
Você também pode baixar o arquivo do SDK a partir do [Caf CDN](https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.17.2/caf-face-liveness_0.17.2.umd.js) e então incluí-lo diretamente no seu projeto. Isso é útil se você preferir hospedar o arquivo do SDK ou se quiser evitar carregá-lo de uma CDN.
{% endhint %}

#### 2. Uso básico

```javascript
const CafFaceLivenessSdk = window["CafFaceLiveness"];

// Inicialize o SDK
await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
  htmlContainerId: "your-container-id",
});

// Execute a detecção de vivacidade facial
try {
  const result = await CafFaceLivenessSdk.run();
  console.log("Resultado da vivacidade:", result);
} catch (error) {
  console.error("Falha na vivacidade:", error);
} finally {
  // Limpe ao terminar com sucesso ou em caso de erro
  CafFaceLivenessSdk.dispose();
}
```

#### Exemplo completo

Aqui está um exemplo HTML pronto para uso:

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Exemplo de CafFaceLiveness</title>
  </head>
  <body>
    <h1>Exemplo do SDK CafFaceLiveness</h1>

    <div id="status"></div>

    <div>
      <button id="initBtn">Inicializar SDK</button>
      <button id="runBtn" disabled>Executar</button>
      <button id="disposeBtn" disabled>Descartar SDK</button>
    </div>

    <div id="your-container-id"></div>

    <script>
      // Elementos da interface
      const statusDiv = document.getElementById("status");
      const initBtn = document.getElementById("initBtn");
      const runBtn = document.getElementById("runBtn");
      const disposeBtn = document.getElementById("disposeBtn");

      function setStatus(message) {
        statusDiv.textContent = message;
      }

      function updateButtons(init = false, run = false, dispose = false) {
        initBtn.disabled = !init;
        runBtn.disabled = !run;
        disposeBtn.disabled = !dispose;
      }

      // Estado inicial dos botões
      updateButtons(false, false, false);

      // Instalação do SDK
      let CafFaceLivenessSdk;
      const loadSdkScript = async (src) => {
        return new Promise((resolve, reject) => {
          const existingScript = document.querySelector(`script[src="${src}"]`);
          if (existingScript) {
            resolve();
            return;
          }

          const script = document.createElement("script");
          script.src = src;
          script.async = true;
          script.onload = resolve;
          script.onerror = () =>
            reject(new Error(`Falha ao carregar o script: ${src}`));
          document.body.appendChild(script);
        });
      };
      loadSdkScript(
        "https://repo.combateafraude.com/javascript/release/caf-face-liveness/0.17.2/caf-face-liveness_0.17.2.umd.js"
      )
        .then(() => {
          CafFaceLivenessSdk = window["CafFaceLiveness"];
          setStatus("O SDK foi carregado e está pronto para ser inicializado");
          updateButtons(true, false, false); // Ative o botão de inicialização
        })
        .catch((error) => {
          console.error("Erro ao carregar o script do SDK CafFaceLiveness:", error);
          setStatus(`Erro ao carregar o SDK: ${error.message}`);
        });

      // Inicializar o SDK
      initBtn.addEventListener("click", async () => {
        try {
          setStatus("Inicializando o SDK...");
          updateButtons(false, false, false);

          await CafFaceLivenessSdk.init(
            "your-sdk-token-here", // Substitua pelo seu token real do SDK
            "user-person-id-here", // Substitua pelo ID da pessoa que você deseja usar
            {
              htmlContainerId: "your-container-id", // Substitua pelo ID do seu contêiner HTML
              performFaceAuthentication: false, // Defina como true se quiser realizar a autenticação facial junto com a detecção de vivacidade
            },
            {
              startButton: {
                label: "Iniciar leitura facial",
                backgroundColor: "#154EF7",
                color: "#ffffff",
              },
            }
          );

          setStatus("SDK inicializado com sucesso!");
          updateButtons(false, true, true);
        } catch (error) {
          setStatus(`Falha na inicialização: ${error.message}`);
          updateButtons(true, false, false);
          console.error("Erro de inicialização:", error);
        }
      });

      // Executar detecção de vivacidade
      runBtn.addEventListener("click", async () => {
        try {
          setStatus("Executando a detecção de vivacidade...");
          updateButtons(false, false, false);

          const result = await CafFaceLivenessSdk.run();

          setStatus("Detecção de vivacidade concluída com sucesso!");
          updateButtons(false, false, true);

          console.log("Resultado da vivacidade:", result);
        } catch (error) {
          setStatus(`Falha na detecção de vivacidade: ${error.message}`);
          console.error("Erro de vivacidade:", error);

          CafFaceLivenessSdk.dispose(); // Descarte o SDK em caso de erro

          updateButtons(true, false, false);
        }
      });

      // Descartar o SDK
      disposeBtn.addEventListener("click", () => {
        try {
          CafFaceLivenessSdk.dispose();
          setStatus("SDK descartado com sucesso");
          updateButtons(true, false, false);
        } catch (error) {
          setStatus(`Falha ao descartar: ${error.message}`);
          console.error("Erro ao descartar:", error);
        }
      });
    </script>
  </body>
</html>
```

### Referência do SDK

#### Inicialização

```typescript
async init(sdkToken: string, personId: string, config?: object, customization?: object): Promise<void>
```

Inicializa o SDK com a configuração fornecida.

| Parâmetro de inicialização | Tipo   | Obrigatório ou opcional | Descrição                                                                                                                                                      |
| -------------------------- | ------ | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sdkToken`                 | string | **Obrigatório**         | Token do SDK para autenticação                                                                                                                                 |
| `personId`                 | string | Obrigatório             | Identificador único do usuário                                                                                                                                 |
| `config`                   | object | Opcional                | <p>Opções de configuração do SDK.</p><p>Consulte a <a href="#configuration-options">Opções de configuração</a> seção para mais detalhes.</p>                   |
| `customization`            | object | Opcional                | <p>Opções de personalização de aparência e texto.</p><p>Consulte a <a href="#customization-options">Opções de personalização</a> seção para mais detalhes.</p> |

**Opções de configuração**

| Parâmetro de configuração   | Tipo    | Obrigatório ou opcional | Descrição                                                                                                                                                                                                                                                                                                                   | Suporte do provedor |
| --------------------------- | ------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- |
| `htmlContainerId`           | string  | Obrigatório (iProov)    | ID do contêiner HTML para a interface do SDK. Obrigatório somente quando o provedor selecionado for **iProov**.                                                                                                                                                                                                             | iProov              |
| `enableDebugMode`           | boolean | Opcional                | Ative o modo de depuração para desenvolvimento                                                                                                                                                                                                                                                                              | Todos os provedores |
| `performFaceAuthentication` | boolean | Opcional                | <p>Se deve realizar a autenticação facial junto com a detecção de vivacidade</p><p>Ativar a autenticação facial requer um rosto previamente registrado para o <code>personId</code>. Consulte a <a href="#face-authentication">Autenticação facial</a> seção para mais detalhes.</p>                                        | Todos os provedores |
| `idioma`                    | string  | Opcional                | Idioma da interface. Valores suportados: "en\_US", "es\_MX", "pt\_BR"                                                                                                                                                                                                                                                       | Todos os provedores |
| `disableAnalytics`          | boolean | Opcional                | Desativar o rastreamento de analytics                                                                                                                                                                                                                                                                                       | Todos os provedores |
| `cameraPreviewFilter`       | string  | Opcional                | <p>Filtro para a pré-visualização da câmera. Valores suportados: "shaded", "classic", "vibrant", "clear", "blur"</p><p>Ao usar o filtro de câmera "clear" com o GPA ativado, o SDK não poderá ser executado e lançará um erro. Se o GPA estiver ativado, certifique-se de usar uma opção diferente de filtro de câmera.</p> | iProov              |
| `reverseProxy`              | object  | Opcional                | <p>Configuração de proxy reverso.</p><p>Consulte a <a href="#reverse-proxy-configuration">Configuração de proxy reverso</a> seção para mais detalhes.</p>                                                                                                                                                                   | iProov              |

**Opções de personalização**

| Parâmetro de personalização     | Tipo   | Descrição                                  | Suporte do provedor |
| ------------------------------- | ------ | ------------------------------------------ | ------------------- |
| `appearance.captureButtonIcon`  | string | URL do ícone do botão de captura           | Caf, FaceTec        |
| `appearance.captureIconSize`    | string | Tamanho do ícone do botão de captura       | Caf, FaceTec        |
| `appearance.captureButtonColor` | string | Cor do botão de captura                    | Caf, FaceTec        |
| `appearance.fontFamily`         | string | Família de fontes da interface             | Caf, FaceTec        |
| `startButton.label`             | string | Texto do botão Iniciar                     | iProov              |
| `startButton.color`             | string | Cor do texto do botão Iniciar              | iProov              |
| `startButton.backgroundColor`   | string | Cor de fundo do botão Iniciar              | iProov              |
| `startButton.borderRadius`      | string | Raio da borda do botão Iniciar             | iProov              |
| `startButton.border`            | string | Estilo da borda do botão Iniciar           | iProov              |
| `startButton.padding`           | string | Preenchimento do botão Iniciar             | iProov              |
| `startButton.margin`            | string | Margem do botão Iniciar                    | iProov              |
| `messages.title`                | string | Texto do título da interface               | Caf, FaceTec        |
| `messages.loading`              | string | Mensagem de carregamento durante a captura | Caf, FaceTec        |
| `messages.errors.captureFailed` | string | Mensagem de erro quando a captura falha    | Caf, FaceTec        |

**Tratando erros de inicialização**

{% hint style="warning" %}
**Importante**: A partir da versão 0.13.0, o tratamento de erros do SDK mudou. Revise e atualize sua integração para se alinhar aos novos nomes e comportamento dos erros.
{% endhint %}

Erros que podem ocorrer durante o `init()` método:

| Nome do erro         | Descrição                                                                                                                          |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `CafSdkInitError`    | Ocorreu um erro durante a inicialização do SDK (por exemplo, parâmetros obrigatórios ausentes).                                    |
| `CafSdkSessionError` | Erro ao criar a sessão para realizar a vivacidade ou a autenticação facial. Verifique se o token fornecido é válido e não expirou. |
| `CafUnknownError`    | Ocorreu um erro interno desconhecido                                                                                               |

{% hint style="info" %}
Quaisquer outros erros inesperados serão lançados como padrão do JavaScript `Erro` classe.
{% endhint %}

**Exemplo:**

```javascript
try {
  await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
    htmlContainerId: "your-container-id",
  });
  console.log("SDK inicializado com sucesso!");
} catch (error) {
  switch (error.name) {
    case "CafSdkInitError":
      console.error("Erro de inicialização do SDK:", error.message);
      break;
    case "CafSdkSessionError":
      console.error("Erro de sessão:", error.message);
      break;
    case "CafUnknownError":
      console.error("Erro interno:", error.message);
      break;
    default:
      console.error("Erro de inicialização inesperado:", error.name, error.message);
  }
}
```

#### Execução

```typescript
async run(options?: object): Promise<string>
```

Executa o processo de detecção de vivacidade facial.

| Parâmetro de execução | Tipo   | Obrigatório ou opcional | Descrição                                                                                                                 |
| --------------------- | ------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `options`             | object | Opcional                | <p>Opções para o método run.</p><p>Consulte a <a href="#run-options">Opções de execução</a> seção para mais detalhes.</p> |

**Opções de execução**

| Opção de execução          | Tipo            | Descrição                                                     |
| -------------------------- | --------------- | ------------------------------------------------------------- |
| `cancelPromise`            | `Promise<void>` | Promise que é resolvida quando a operação deve ser cancelada. |
| `onCaptureProcessingStart` | function        | Callback chamado quando o processamento da captura começa.    |
| `onCaptureProcessingEnd`   | function        | Callback chamado quando o processamento da captura termina.   |

**Retorna**

O método retorna um `Promise<string>` que é resolvida com um **string de token JWT** contendo o resultado da execução.

**Importante**: Os campos descritos abaixo estão contidos no **payload decodificado** deste token JWT. Você deve decodificar e verificar o token JWT para acessar esses campos.

**Estrutura do payload JWT**

Após decodificar o JWT, o payload contém um objeto com as seguintes propriedades:

* `imageUrl` (string): URL temporária da imagem capturada
* `isAlive` (boolean): Indica se a verificação de vivacidade foi bem-sucedida
* `isMatch` (boolean): Indica se a autenticação facial foi bem-sucedida (se ativada)
* `sessionId` (string): Identificador único da sessão da execução
* `personId` (string): O ID da pessoa usado para a execução

**Tratando erros de execução**

{% hint style="warning" %}
**Importante**: A partir da versão 0.13.0, o tratamento de erros do SDK mudou. Revise e atualize sua integração para se alinhar aos novos nomes e comportamento dos erros.
{% endhint %}

Erros que podem ocorrer durante o `run()` método:

| Nome do erro                           | Descrição                                                                  |
| -------------------------------------- | -------------------------------------------------------------------------- |
| `CafCameraPermissionError`             | Erro ao obter permissão da câmera                                          |
| `CafCameraPermissionDeniedError`       | Permissão da câmera negada pelo usuário                                    |
| `CafCameraUnsupportedError`            | A câmera não é suportada pelo navegador/dispositivo                        |
| `CafSdkRunError`                       | Ocorreu um erro durante a execução do SDK                                  |
| `CafSdkCanceledError`                  | Execução do SDK cancelada pelo usuário ou `cancelPromise`                  |
| `CafFaceLivenessError`                 | Erro durante a validação de vivacidade                                     |
| `CafFaceAuthenticationError`           | Erro durante a autenticação facial                                         |
| `CafFaceNotFoundError`                 | Nenhum rosto registrado foi encontrado para o usuário                      |
| `CafUnknownError`                      | Ocorreu um erro interno desconhecido                                       |
| `CafUnsupportedError`                  | O SDK não é suportado neste dispositivo, navegador ou sistema operacional. |
| `CafDeviceMotionPermissionDeniedError` | Permissão de movimento do dispositivo negada pelo usuário.                 |

{% hint style="info" %}
Quaisquer outros erros inesperados serão lançados como padrão do JavaScript `Erro` classe.
{% endhint %}

**Exemplo:**

```javascript
try {
  const result = await CafFaceLivenessSdk.run();
  console.log("Resultado da vivacidade:", result);
} catch (error) {
  switch (error.name) {
    case "CafCameraPermissionError":
      console.error("Erro geral de permissão da câmera:", error.message);
      break;
    case "CafCameraPermissionDeniedError":
      console.error("Erro de permissão da câmera negada:", error.message);
      break;
    case "CafCameraUnsupportedError":
      console.error("Erro de câmera não suportada:", error.message);
      break;
    case "CafSdkRunError":
      console.error("Erro durante a execução do SDK:", error.message);
      break;
    case "CafSdkCanceledError":
      console.error("Erro de cancelamento do SDK:", error.message);
      break;
    case "CafFaceLivenessError":
      console.error("Erro de detecção de vivacidade:", error.message);
      break;
    case "CafFaceAuthenticationError":
      console.error("Erro de autenticação facial:", error.message);
      break;
    case "CafFaceNotFoundError":
      console.error("Nenhum rosto cadastrado encontrado para o usuário:", error.message);
      break;
    case "CafUnsupportedError":
      console.error("Erro não suportado:", error.message);
      break;
    case "CafDeviceMotionPermissionDeniedError":
      console.error("Erro de permissão de movimento do dispositivo negada:", error.message);
      break;
    case "CafUnknownError":
      console.error("Erro interno:", error.message);
      break;
    default:
      console.error("Erro inesperado na execução:", error.name, error.message);
  }
}
```

#### Descarte

```typescript
dispose(): void
```

Limpa os recursos do SDK. Deve ser chamado quando o SDK não for mais necessário.

**Exemplo**

```javascript
try {
  CafFaceLivenessSdk.dispose();
  console.log("SDK descartado com sucesso");
} catch (error) {
  console.error("Erro ao descartar:", error.name, error.message);
}
```

### Produtos

#### Vivacidade Facial

O SDK fornece detecção de vivacidade facial para garantir que o usuário esteja vivo e presente durante o processo.

**Como a Vivacidade Facial funciona**

1. **Acesso à câmera**: O SDK solicita acesso à câmera do usuário
2. **Captura facial**: O SDK captura uma foto do rosto do usuário
3. **Validação de vivacidade**: O SDK analisa o rosto capturado para verificar se o usuário está vivo
4. **Resultado**: A carga útil do token JWT inclui o `isAlive` campo indicando se o usuário está vivo

**Interpretação do resultado da Vivacidade Facial**

| isAlive      | Significado                                                      |
| ------------ | ---------------------------------------------------------------- |
| `verdadeiro` | ✅ O usuário está vivo e a verificação de vivacidade foi aprovada |
| `falso`      | ❌ A detecção de vivacidade falhou                                |

#### Autenticação facial

O SDK suporta autenticação facial a ser realizada בנוסף à detecção de vivacidade. Quando ativado, após a validação de vivacidade, o SDK comparará o rosto capturado com um rosto cadastrado anteriormente para verificar a identidade do usuário.

Para ativar a autenticação facial, defina o `performFaceAuthentication` parâmetro como `verdadeiro` durante a inicialização do SDK:

```javascript
await CafFaceLivenessSdk.init("your-sdk-token", "user-person-id", {
  htmlContainerId: "your-container-id",
  performFaceAuthentication: true, // Ativar autenticação facial
});
```

**Como a Autenticação Facial funciona**

1. **Cadastro facial**: O rosto do usuário deve ter sido previamente cadastrado usando o `personId`
2. **Vivacidade Facial**: O SDK captura o rosto do usuário e realiza a validação de vivacidade
3. **Autenticação facial**: O rosto capturado é comparado com o rosto cadastrado para o `personId`
4. **Resultado**: A carga útil do token JWT inclui o `isMatch` campo indicando se há uma correspondência com o rosto cadastrado

**Interpretação do resultado da Autenticação Facial**

| isAlive      | isMatch      | Significado                                                     |
| ------------ | ------------ | --------------------------------------------------------------- |
| `verdadeiro` | `verdadeiro` | ✅ O usuário está vivo e o rosto corresponde ao rosto cadastrado |
| `verdadeiro` | `falso`      | ⚠️ O usuário está vivo, mas o rosto não corresponde             |
| `falso`      | -            | ❌ A detecção de vivacidade falhou                               |

### Configuração de proxy reverso

Se você optar por usar um proxy reverso, você deve configurá-lo para encaminhar corretamente as solicitações para os endpoints apropriados. Abaixo está o mapeamento de redirecionamento:

* `/v1/` → `https://web.us.prd.caf.io/bff/`
* `/std/` → `https://us.rp.secure.iproov.me/`
* `/std/ws/` → `wss://us.rp.secure.iproov.me/ws/`
* `/assets/` → `https://cdn.iproov.app/`

#### Exemplo de configuração de proxy reverso

Supondo que seu domínio seja `my.proxy.io`, a configuração do seu SDK ficaria assim:

```javascript
reverseProxy: {
  authenticationBaseUrl: "https://my.proxy.io/v1/",
  faceLivenessBaseUrl: "https://my.proxy.io/std/",
  assetsBaseUrl: "https://my.proxy.io/assets/"
}
```

**Observação:** Os caminhos fornecidos neste exemplo são apenas para referência. Você pode configurar seu proxy e seus caminhos de acordo com seus padrões de melhores práticas.

### Opções de integração

{% tabs %}
{% tab title="iframe" %}
Para realizar a integração por meio de um `iframe`, as permissões de câmera e tela cheia devem ser fornecidas.

```html
<iframe
  src="https://your-iframe-target.example"
  style="width: 100vw; height: 100vh; border: 0"
  allow="camera;fullscreen;accelerometer;gyroscope;magnetometer;"
  allowfullscreen="true"
></iframe>
```

#### Requisitos de permissão de sensor do iOS

As versões recentes do iOS 26 introduziram mudanças que quebraram o fluxo de permissão do sensor de movimento para integrações em iframe. A solução alternativa que dependia de um botão de permissão prévia parou de funcionar e foi descontinuada.

A partir da versão `0.14.1`, o **iProov** provedor incluso foi atualizado, o que lida nativamente com os novos requisitos do iOS quando o Web SDK é executado dentro de um iframe. O único caminho suportado é atualizar sua integração para CafFaceLiveness `0.14.1` (ou mais recente). Versões anteriores não funcionarão nos dispositivos mais recentes com iOS 26, mesmo que você mantenha a solução alternativa anterior em vigor.

Após a atualização, você pode incorporar o iframe exatamente como mostrado acima. Não são necessários botões extras nem fluxos de permissão personalizados.
{% endtab %}

{% tab title="Webview" %}
Para usar o SDK por meio de um Webview, a permissão da câmera deve ser concedida no seu aplicativo nativo.

Exemplo de implementação no Android:

`AndroidManifest.xml`

```java
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
```

`MainActivity`

```java
  @Override
  public void onPermissionRequest(final PermissionRequest request) {
    request.grant(request.getResources());
  }
```

Exemplo [android](https://github.com/combateafraude/android-webview-example) projeto android para implementação em webview; além disso, é necessário conseguir abrir o aplicativo em tela cheia, o exemplo mostra como configurá-lo corretamente.
{% endtab %}
{% endtabs %}

### Eventos do SDK

O SDK dispara vários eventos durante seu ciclo de vida para poder lidar com diferentes cenários do processo de detecção de vivacidade e proporcionar uma melhor experiência ao usuário.

Ouça os eventos usando o padrão de listener de eventos do DOM:

```javascript
document.addEventListener("event-name", (event) => {
  console.log("Dados do evento:", event.detail);
});
```

{% hint style="info" %}
Atualmente, os eventos estão disponíveis apenas ao usar o **iProov** provedor. O suporte a eventos para outros provedores está planejado para versões futuras.
{% endhint %}

{% tabs %}
{% tab title="iProov" %}

#### Eventos disponíveis

| Nome do evento       | Descrição                                            | Suporte do provedor |
| -------------------- | ---------------------------------------------------- | ------------------- |
| `iniciado`           | O processo de detecção de vivacidade começa          | iProov              |
| `sdk-button-ready`   | O botão de início do SDK está pronto para interação  | iProov              |
| `sdk-button-clicked` | O usuário clicou no botão de início do SDK           | iProov              |
| `streaming`          | O streaming foi iniciado, permanecendo em tela cheia | iProov              |
| `streamed`           | Fim do streaming e saída da tela cheia               | iProov              |
| `aprovado`           | A detecção de vivacidade foi bem-sucedida            | iProov              |
| `falhou`             | A detecção de vivacidade falha                       | iProov              |
| `cancelado`          | O usuário cancela o processo                         | iProov              |
| `erro`               | Ocorreu um erro durante o processo                   | iProov              |
| `não suportado`      | O navegador não suporta o SDK                        | iProov              |

#### Detalhes do evento: evento "failed" do iProov

Quando a detecção de vivacidade falha, o `falhou` evento fornece feedback específico:

```javascript
document.addEventListener("failed", (event) => {
  console.log("Motivo: ", event.detail.reason);
  console.log("Feedback: ", event.detail.feedback);
});
```

A tabela abaixo resume os possíveis `falhou` detalhes do evento:

| Feedback            | Motivo                                                 | LA | GPA |
| ------------------- | ------------------------------------------------------ | -- | --- |
| eyes\_closed        | Mantenha os olhos abertos                              | ✅  | ✅   |
| face\_too\_far      | Aproxime o rosto da tela                               | ❌  | ✅   |
| face\_too\_close    | Afaste o rosto da tela                                 | ❌  | ✅   |
| misaligned\_face    | Mantenha o rosto dentro do oval                        | ❌  | ✅   |
| multiple\_faces     | Certifique-se de que apenas uma pessoa esteja visível  | ✅  | ✅   |
| obscured\_face      | Remova qualquer cobertura facial                       | ✅  | ✅   |
| sunglasses          | Remova os óculos de sol                                | ✅  | ✅   |
| too\_bright         | Luz ambiente muito forte ou brilho da tela muito baixo | ✅  | ✅   |
| too\_dark           | Seu ambiente parece estar muito escuro                 | ✅  | ✅   |
| too\_much\_movement | Por favor, fique parado                                | ❌  | ✅   |
| desconhecido        | Tente novamente                                        | ✅  | ✅   |

#### Detalhes do evento: evento "error" do iProov

Quando ocorre um erro durante o processo de detecção de vivacidade, o `erro` evento fornece detalhes adicionais sobre o erro:

```javascript
document.addEventListener("error", (event) => {
  console.log("Motivo: ", event.detail.reason);
  console.log("Feedback: ", event.detail.feedback);
});
```

A tabela abaixo resume os possíveis `erro` detalhes do evento:

| Feedback                           | Motivo                                                                     |
| ---------------------------------- | -------------------------------------------------------------------------- |
| desconhecido                       | Tente novamente                                                            |
| client\_camera                     | Ocorreu um erro ao obter o vídeo da câmera                                 |
| client\_error                      | Ocorreu um erro desconhecido                                               |
| error\_asset\_fetch                | Não foi possível buscar os recursos                                        |
| error\_camera                      | A câmera não pode ser iniciada por motivos desconhecidos                   |
| error\_camera\_in\_use             | A câmera já está em uso e não pode ser acessada                            |
| error\_camera\_not\_supported      | A resolução da câmera é muito baixa                                        |
| error\_camera\_permission\_denied  | O usuário negou nossa solicitação de permissão da câmera                   |
| error\_device\_motion\_denied      | O usuário negou nossa solicitação de permissão de movimento do dispositivo |
| error\_device\_motion\_unsupported | Seu dispositivo parece não informar totalmente o movimento do dispositivo  |
| error\_fullscreen\_change          | Saiu da tela cheia sem concluir o iProov                                   |
| error\_invalid\_token              | O token interno do SDK é inválido                                          |
| error\_network                     | Erro de rede                                                               |
| error\_no\_face\_found             | Nenhum rosto pôde ser encontrado                                           |
| error\_not\_supported              | O dispositivo ou a integração não consegue executar o Web SDK              |
| error\_server                      | Ocorreu um erro ao comunicar-se com os servidores do iProov                |
| error\_token\_timeout              | O token foi solicitado muito tempo depois de ter sido criado               |
| error\_too\_many\_requests         | O serviço está sob alta demanda e o usuário deve tentar novamente          |
| error\_user\_timeout               | O usuário iniciou a solicitação, mas não transmitiu a tempo                |
| integration\_unloaded              | O SDK foi desmontado do DOM antes de concluir                              |
| sdk\_unsupported                   | O SDK passou do fim de sua vida útil e não é mais suportado                |
| {% endtab %}                       |                                                                            |
| {% endtabs %}                      |                                                                            |

## Notas de lançamento

### CafFaceLiveness v0.17.2

#### Correções

* **provedor iProov**: Corrigido o problema de comportamento de zoom em tablets no modo paisagem, garantindo o dimensionamento adequado da exibição em todos os dispositivos.
* **provedor Payface**: Ampliada a janela de tempo limite de carregamento do SDK e adicionados registros de diagnóstico para melhorar a confiabilidade da inicialização em conexões de rede lentas.

### CafFaceLiveness v0.17.1

#### Melhorias

* **Dependências atualizadas**: Atualizado o provedor Payface com importantes melhorias de segurança e na captura facial.

#### Correções

* **provedor iProov**: Corrigido um problema em que a tela de captura facial não era exibida corretamente em tela cheia em dispositivos móveis iOS.

### CafFaceLiveness v0.17.0

#### Novos recursos

* **Tratamento específico para rosto não cadastrado**: Adicionado `CafFaceNotFoundError`. Quando nenhum rosto está cadastrado para o `personId`, o SDK agora gera esse erro específico em vez de um genérico, melhorando significativamente o tratamento de erros no frontend.

#### Melhorias

* Melhor tratamento dos erros de falha do usuário, incluindo rosto não encontrado, permissão da câmera negada e erros de movimento do dispositivo.
* **Dependências atualizadas**: Atualizadas as dependências internas para aumentar a segurança e a estabilidade.
* **Registro**: Aprimorados os registros internos e a análise para melhor depuração e monitoramento.

### CafFaceLiveness v0.16.0

#### Recursos

* **Evento de clique no botão de início**: Adicionado um novo `sdk-button-clicked` evento, disparado quando o usuário clica no botão de início do iProov. Use-o junto com o `sdk-button-ready` evento existente para acompanhar o engajamento do usuário durante o fluxo de verificação.

#### Correções

* Corrigido um erro que podia ocorrer ao chamar `dispose()` depois que o fluxo de vivacidade já havia sido concluído.

### CafFaceLiveness v0.15.1

#### Melhorias

* **Dependências atualizadas**: Atualizado o provedor iProov e as dependências internas para melhorar o desempenho e a estabilidade.
* **Tratamento de erros**: Melhorado o tratamento de erros para o provedor iProov.
* **Registro**: Aprimorados os registros internos e a análise para melhor depuração e monitoramento.

#### Recursos

* **Análise**: Adicionados novos eventos ao sistema interno de análise para rastrear melhor a compatibilidade e o suporte do navegador.

### CafFaceLiveness v0.14.3

#### Correções

* Adicionados erros para navegadores não suportados e permissões de movimento do dispositivo negadas: `CafUnsupportedError` e `CafDeviceMotionPermissionDeniedError`.
* Melhorada a análise adicionando registros mais específicos para erros e falhas usando o provedor iProov.

### CafFaceLiveness v0.14.2

#### Análise aprimorada do SDK

* Melhorado o registro adicionando informações sobre tentativas de captura e métricas específicas de qualidade.
* Adicionado **rastreamento de abandono**: quando um usuário abandona abruptamente a jornada antes da conclusão, como ao fechar a janela do navegador, minimizar a aba ou navegar para uma página diferente, o SDK rastreará esse evento para fornecer melhores insights sobre a jornada do usuário e os possíveis motivos do abandono.

### CafFaceLiveness v0.14.1

{% hint style="warning" %}
**Importante para o provedor iProov**: Atualizar para a versão `0.14.1` ou mais recente é necessário para integrações em iframe nas versões mais recentes do iOS.
{% endhint %}

#### Correções

* Atualizado o **iProov** mecanismo do provedor, corrigindo a inicialização de iframes em dispositivos com iOS 26.x e eliminando a solução alternativa anterior de permissão do sensor de movimento.

### CafFaceLiveness v0.14.0

#### Melhorias

Esta versão inclui uma atualização do nosso provedor Payface que melhora a experiência do usuário, resultando em taxas de sucesso mais altas. As principais melhorias incluem:

* **Orientação aprimorada ao usuário**: Novos alertas de iluminação ajudam os usuários a encontrar as condições ideais para uma captura bem-sucedida.
* **Acessibilidade aprimorada**: Instruções mais claras criam uma jornada do usuário mais fluida e inclusiva.
* **Experiência mais responsiva**: Cancelar a captura agora é mais rápido, melhorando a usabilidade.

#### Recursos

* **Fingerprinting do dispositivo**: Coleta a impressão digital do dispositivo durante a verificação para fortalecer a prevenção a fraudes e a análise de risco. Desativado por padrão; entre em contato com nossa equipe para ativar.

### CafFaceLiveness v0.13.0

{% hint style="warning" %}
**Mudança incompatível**: Os nomes dos erros foram alterados na v0.13.0. Recomendamos fortemente revisar a [Referência do SDK](#sdk-reference) seção antes de atualizar para esta versão para manter a compatibilidade.
{% endhint %}

* **Tratamento de erros simplificado com base em nomes**: Consolidamos os tipos de erro em nomes claros e descritivos para melhorar a consistência.
* **Dependências atualizadas**: Melhorada a estabilidade, a segurança e a compatibilidade do SDK.

### CafFaceLiveness v0.12.1

* **Sistema de captura de imagem mais robusto**: O SDK agora conta com um mecanismo inteligente de fallback, garantindo que a captura de imagem funcione de forma mais confiável em diferentes dispositivos e navegadores, mesmo em cenários com limitações técnicas.
* **Validação aprimorada da qualidade da imagem**: Novas validações foram implementadas para evitar imagens de baixa qualidade, aumentando a confiabilidade do processo de captura.
* **Otimização de desempenho na inicialização**: O processo de inicialização do SDK agora é mais rápido e leve, reduzindo o tempo de espera do usuário.
* **Feedback visual aprimorado**: Novos eventos e mensagens de status permitem que a interface do usuário informe com mais precisão o usuário sobre o momento da captura.

### CafFaceLiveness v0.12.0

#### Recursos

* **Seleção de câmera aprimorada**: Detecção inteligente de rótulo/modo de frente com seleção heurística da melhor câmera (Caf e FaceTec).
* **Descoberta unificada e reutilização de stream**: Descoberta única de mídia do usuário com reutilização de stream e fallback automático de câmera, reduzindo solicitações de permissão e acelerando a inicialização (Caf e FaceTec).
* **Troca de câmera mais rápida**: Troca de câmera quase instantânea com seleções em cache (Caf e FaceTec).

### CafFaceLiveness v0.11.2

#### Melhorias

**Experiência do usuário aprimorada durante interrupções**: Comportamento aprimorado de Face Liveness quando os usuários passam por mudanças de foco ou interrupções durante sessões de captura facial usando o provedor Payface.

* Adicionada funcionalidade de pausar/retomar quando o foco do navegador é perdido (troca de aba, minimização etc.)
* Agora os usuários podem se recuperar de interrupções em vez de reiniciar todo o processo de captura
* Redução nas taxas de abandono de sessão devido a interrupções acidentais

### CafFaceLiveness v0.11.1

#### Correções

**Compatibilidade aprimorada com dispositivos**: Estabilidade e compatibilidade aprimoradas do Face Liveness em vários dispositivos e navegadores, reduzindo significativamente as falhas de sessão e melhorando a experiência do usuário durante o processo de verificação facial usando o provedor Payface.

* Corrigidos problemas de compatibilidade que estavam causando erros de "não suportado" em determinados dispositivos
* Confiabilidade aprimorada da inicialização da câmera em diferentes dispositivos móveis e navegadores
* Redução nas taxas de abandono durante sessões de Face Liveness

### CafFaceLiveness v0.11.0

#### Recursos

**Inicialização da câmera aprimorada**: Refatorada a inicialização da câmera ao usar os provedores Caf ou FaceTec, movendo a configuração da câmera da inicialização do SDK para a fase de execução, resultando em inicialização mais rápida e melhor gerenciamento de recursos.

#### Correções

* Corrigido um problema em que o stream da câmera não era reproduzido automaticamente ao inicializar o SDK dentro de um WebView móvel.

### CafFaceLiveness v0.10.1

#### Correções

* Garante que o SDK seja fechado corretamente após erros de captura ao usar os provedores Caf ou FaceTec, evitando estados inconsistentes e permitindo que o usuário tente o processo novamente.

### CafFaceLiveness v0.10.0

#### Recursos

**Rastreamento de analytics aprimorado**: Rastreamento de eventos de analytics aprimorado, fornecendo melhor monitoramento de erros e recursos de depuração do SDK.

#### Correções

* Corrigidas falhas de inicialização da câmera e problemas de sobreposição em tela cheia ao usar os provedores Caf ou FaceTec.
* Corrigida a configuração de proxy reverso para encaminhar corretamente as solicitações para os endpoints desejados.

### CafFaceLiveness v0.9.0

#### Recursos

* **Modo de tela cheia**: Habilite o modo de tela cheia ao usar os provedores Caf ou FaceTec para melhorar a experiência do usuário.
* **Melhorias no Payface**: Provedor Payface atualizado para melhorar a observabilidade e a compatibilidade com Webview.

### CafFaceLiveness v0.7.3

#### Correções

Corrigido um problema em que o SDK não estava habilitando a autenticação facial ao usar o provedor Payface. Agora o SDK realiza corretamente a autenticação facial quando a `performFaceAuthentication` opção é definida como `verdadeiro` durante a inicialização.

### CafFaceLiveness v0.7.2

Apresentando **CafFaceLiveness**, um Web SDK para detecção de vitalidade facial e autenticação em aplicações web.

#### Recursos

* **Detecção de Vitalidade Facial**: Validação em tempo real para garantir a presença do usuário
* **Autenticação facial**: Verificação de identidade opcional contra faces registradas
* **Suporte a Múltiplos Provedores**: Roteamento automático entre os provedores Caf, FaceTec, iProov e Payface
* **Configuração Flexível**: Opções de personalização para a interface e o comportamento
* **Vários Idiomas**: Suporte nativo para inglês, espanhol e português
* **Proxy Reverso**: Tráfego seguro da API por meio da configuração de proxy reverso

{% hint style="info" %}
**Observação**: Esta é a versão inicial do CafFaceLiveness Web SDK. Versões futuras incluirão recursos adicionais, melhorias e suporte ampliado a provedores.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.caf.io/caf-sdk/caf-sdk-pt-br/web-javascript/getting-started/face-liveness-and-face-authenticator.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
