Guía oficial de integración Para sitios y aplicaciones web

Integra la biblioteca JavaScript fio.js y el Widget de FACEIO en tu sitio o aplicación web. Usa enroll() para registrar nuevos usuarios y authenticate() para que los usuarios registrados vuelvan a iniciar sesión mediante autenticación facial.

quick-start.js
JavaScript
// 1. Añade este código al HTML antes de </body>
<div id="faceio-modal"></div>
<script src="https://cdn.faceio.net/fio.js"></script>

// 2. Crea la instancia con tu Public ID
const faceio = new faceIO("app-public-id");

// 3. Registra un usuario nuevo
faceio.enroll({ "locale": "auto",
         "payload": { "email": "user@example.com" }
}).then(userInfo => {
  console.log(`Registrado: ${userInfo.facialId}`);
}).catch(err => handleError(err));

// 4. Autentica un usuario existente
faceio.authenticate({ "locale": "auto" })
.then(userData => {
  console.log("Payload:", JSON.stringify(userData.payload));
}).catch(err => handleError(err));

¿Qué es FACEIO?

FACEIO es una plataforma de autenticación facial de PixLab ↗ que permite a una aplicación web registrar y autenticar usuarios por su rostro sin exigir contraseñas, códigos OTP ni sensores biométricos dedicados en el flujo de FACEIO. Utiliza una cámara web estándar o la cámara de un teléfono en navegadores modernos compatibles.

La biblioteca del lado del cliente es fio.js. Expone dos métodos principales: enroll() para el registro y authenticate() para el inicio de sesión, además de la utilidad restartSession() para flujos con varias operaciones. FACEIO coordina el flujo de autenticación, mientras que el motor de reconocimiento facial elegido por el propietario de la aplicación realiza la comparación facial y gestiona los hashes biométricos. Tu aplicación recibe una Promise resuelta con el Facial ID y el payload que hayas asociado durante el registro.

¿Es tu primera vez con FACEIO?

Empieza con la Guía de configuración en 5 minutos para crear tu primera aplicación y obtener su Public ID desde la FACEIO Console ↗.


Integración de la biblioteca fio.js

fio.js funciona en navegadores modernos compatibles con una cámara web estándar o la cámara de un teléfono, sin necesidad de un sensor biométrico dedicado. La biblioteca JavaScript es independiente del framework y puede utilizarse con React, Vue, Angular, Next.js o JavaScript sin framework.

1 Importar fio.js en tu sitio web

Pega el siguiente fragmento antes de la etiqueta de cierre </body> en cualquier página donde quieras ofrecer autenticación facial. La biblioteca se carga desde la CDN ↗ de FACEIO. El alojamiento propio no es compatible, por lo que las integraciones reciben las actualizaciones compatibles de fio.js desde la CDN de FACEIO.

index.html
HTML
<div id="faceio-modal"></div>
<script src="https://cdn.faceio.net/fio.js"></script>

2 Crea una instancia de faceIO

Crea una instancia de faceIO() con el Public ID de tu aplicación. Este identificador está disponible en el Administrador de aplicaciones de la FACEIO Console ↗.

app.js
JavaScript
<script type="text/javascript">
  /* Crea una instancia de fio.js con el Public ID */
  const faceio = new faceIO("app-public-id");
</script>

Antes de continuar, comprueba que has:

3 Inicia el Widget

Con fio.js cargado y la instancia faceIO() lista, inicia el proceso de reconocimiento facial llamando a uno de los métodos expuestos por la clase:

enroll()

Registra un usuario nuevo mediante reconocimiento facial. Es el equivalente sin contraseña de un registro tradicional.

authenticate()

Autentica a un usuario registrado previamente. Es el equivalente sin contraseña de un inicio de sesión tradicional.

app.js
JavaScript
<button onclick="enrollNewUser()">Registrar usuario nuevo</button>
<button onclick="authenticateUser()">Autenticar usuario</button>

<script type="text/javascript">
  const faceio = new faceIO("app-public-id");

  function enrollNewUser() {
    // faceio.enroll() inicia el flujo de registro
  }

  function authenticateUser() {
    // faceio.authenticate() inicia el flujo de autenticación
  }

  function handleError(errCode) {
    // Gestiona el error aquí
  }
</script>

Plantilla de referencia

La plantilla HTML incluye una implementación de referencia con ambos métodos y manejo completo de errores.


enroll() - Registrar un usuario nuevo

Inicia el Widget de FACEIO para registrar un usuario nuevo mediante reconocimiento facial. Es el equivalente sin contraseña de un registro tradicional. Si la operación finaliza correctamente, devuelve una Promise resuelta con un objeto userInfo que contiene el Facial ID único del usuario, la marca de tiempo del registro y estimaciones demográficas de género y edad.

Sintaxis

Firma
promise = faceio.enroll({ parameters })
Alias
enrol() register() record()
Devuelve
Una Promise que se resuelve con un objeto userInfo si la operación se completa, o se rechaza con un fioErrCode si falla.

Descripción

Comportamiento

Al invocarlo, el Widget de FACEIO solicita el consentimiento del usuario cuando corresponde, pide acceso a la cámara y envía la captura al motor de reconocimiento facial elegido por el propietario de la aplicación.

FACEIO no almacena, gestiona ni accede a hashes biométricos. El motor de reconocimiento facial seleccionado crea y gestiona los hashes biométricos utilizados para la comparación, mientras que tu integración recibe el Facial ID resultante y los datos del registro.

PIN
Durante el registro, los usuarios definen un PIN Code de 4 a 16 dígitos. Puede solicitarse en autenticaciones posteriores si se produce una coincidencia entre rostros, si la confianza de la comparación queda ligeramente por debajo del 99 % o si tu sitio web o aplicación web exige la confirmación del PIN Code.
Payload
El payload permite asociar datos arbitrarios (correo electrónico, userId, nombre, etc.) al usuario registrado. Estos datos se devuelven después de cada autenticación correcta de ese usuario. El tamaño máximo es de 16 KB. Codifica en Base64 cualquier contenido binario o que no sea ASCII.
Webhook
Si has configurado un Webhook, FACEIO enviará mediante POST los datos del registro a tu endpoint para sincronizar el backend en tiempo real.

Parámetros

Acepta un único objeto opcional. Todas sus propiedades son opcionales:

Propiedad Type Valor predeterminado Descripción
payload JSON null Datos arbitrarios asociados al usuario y devueltos en autenticaciones posteriores. Máximo de 16 KB. Codifica en Base64 los datos que no sean ASCII.
permissionTimeout Number 27 sec Segundos de espera para obtener permiso de acceso a la cámara. Se interrumpe con fioErrCode.PERMISSION_REFUSED al agotarse el tiempo de espera.
termsTimeout Number 10 min Minutos de espera para que se acepten los Términos de servicio. Se interrumpe con fioErrCode.TERMS_NOT_ACCEPTED al agotarse el tiempo de espera.
idleTimeout Number 27 sec Segundos de espera si no se detecta ningún rostro. Se interrumpe con fioErrCode.NO_FACES_DETECTED al agotarse el tiempo de espera.
replyTimeout Number 40 sec Segundos de espera para recibir una respuesta del servidor. Se interrumpe con fioErrCode.TIMEOUT al agotarse el tiempo de espera.
enrollIntroTimeout Number 12 sec Segundos durante los que se muestra la pantalla de introducción e instrucciones del registro.
locale String auto Idioma del Widget. auto detecta el idioma del navegador. También puedes proporcionar un código BCP 47 (en, ar, es, ja, de). Si no es compatible, utiliza en-US.
userConsent Boolean false Establece true si ya obtuviste el consentimiento del usuario, por ejemplo durante la creación de la cuenta. Esto omite la pantalla de consentimiento de los Términos de servicio. Es tu responsabilidad solicitar el consentimiento explícito antes de registrar a un usuario nuevo. Consulta la guía de prácticas recomendadas de privacidad.
showAbortBtn Boolean false Establece true para mostrar siempre el botón de cierre o cancelación. Si el usuario lo pulsa, se genera fioErrCode.ABORTED_BY_USER.

Valor devuelto

userInfo

Una Promise que se resuelve con un objeto userInfo si la operación se completa, o se rechaza con un código de error si falla:

Propiedad Type Descripción
facialId String (UUID) Identificador único asignado por el motor de reconocimiento facial. Consulta Facial ID.
timestamp String ISO 8601 ↗ marca de tiempo de finalización del registro.
details Object Contiene las estimaciones de gender y age del usuario registrado.

Ejemplo

Uso
app.js
JavaScript
// Crea una instancia de fio.js con el Public ID de tu aplicación
const faceio = new faceIO("app-public-id");
function enrollNewUser(){
faceio.enroll({
  "locale": "auto", // Idioma predeterminado del usuario
  "payload": {
      /* Payload que se asociará con este usuario y se devolverá en sus futuras autenticaciones. */
      "whoami": 123456, // Identificador de ejemplo asociado a este usuario
      "email": "john.doe@example.com"
      }
  }).then(userInfo => {
      // Usuario registrado correctamente 
      alert(
          `Usuario registrado correctamente. Detalles:
           Facial ID único: ${userInfo.facialId}
           Fecha de registro: ${userInfo.timestamp}
           Género estimado: ${userInfo.details.gender}
           Edad aproximada: ${userInfo.details.age}`
      );
     console.log(userInfo);
     // Procesa el resultado, guarda el Facial ID y redirige al panel
  }).catch(errCode => {
     // Registra el error producido durante el registro
     handleError(errCode);
  })
}
Notas
  • Guarda el facialId devuelto en tu base de datos como clave de autenticación única del usuario.
  • El payload se devuelve sin cambios en cada llamada posterior a authenticate() para este usuario.
  • Consulta la plantilla HTML para ver una referencia funcional completa.

authenticate() - Autenticar un usuario

Inicia el Widget de FACEIO para verificar a un usuario registrado previamente. Es el equivalente sin contraseña de un inicio de sesión tradicional. Si la operación finaliza correctamente, devuelve una Promise resuelta con un objeto userData que contiene el Facial ID del usuario, la marca de tiempo de autenticación y el payload asociado durante el registro.

Sintaxis

Firma
promise = faceio.authenticate({ parameters })
Alias
auth() recognize() identify()
Devuelve
Una Promise que se resuelve con un objeto userData si la operación se completa, o se rechaza con un fioErrCode si falla.

Descripción

Comportamiento

Al invocarlo, el Widget de FACEIO solicita acceso a la cámara y compara la captura con el índice facial de usuarios registrados en tu aplicación. La duración depende del permiso de cámara, la calidad de imagen, las comprobaciones de liveness, la conexión de red y la configuración del flujo.

El motor de reconocimiento facial seleccionado realiza la comparación facial. FACEIO no almacena, gestiona ni accede a hashes biométricos, y tu integración del lado del cliente trabaja con el resultado de autenticación devuelto.

PIN
Puede mostrarse una solicitud de PIN Code si se detecta una coincidencia entre rostros, si la confianza queda ligeramente por debajo del 99 % o si tu sitio web o aplicación web exige la confirmación del PIN Code mediante las opciones de seguridad de FACEIO Console.
Payload
El payload asociado durante enroll() se devuelve sin cambios dentro del objeto userData resuelto. Valida el facialId devuelto y aplica tus propias reglas de autorización en el servidor antes de crear una sesión en tu sitio web o aplicación web.
Webhook
Si se ha configurado un Webhook, FACEIO envía mediante POST los datos del evento a tu endpoint después de una autenticación correcta.

Parámetros

Acepta un único objeto opcional. Todas sus propiedades son opcionales:

Propiedad Type Valor predeterminado Descripción
permissionTimeout Number 27 sec Segundos de espera para obtener permiso de acceso a la cámara. Se interrumpe con fioErrCode.PERMISSION_REFUSED al agotarse el tiempo de espera.
idleTimeout Number 27 sec Segundos de espera si no se detecta ningún rostro. Se interrumpe con fioErrCode.NO_FACES_DETECTED al agotarse el tiempo de espera.
replyTimeout Number 40 sec Segundos de espera para recibir una respuesta del servidor. Se interrumpe con fioErrCode.TIMEOUT al agotarse el tiempo de espera.
locale String auto Idioma del Widget. auto detecta el idioma del navegador. También puedes proporcionar un código BCP 47 (en, ar, es, ja, de). Si no es compatible, utiliza en-US.

Valor devuelto

userData

Una Promise que se resuelve con un objeto userData si la operación se completa, o se rechaza con un código de error si falla:

Propiedad Type Descripción
facialId String (UUID) Identificador único asignado durante el registro. Consulta la documentación de Facial ID.
payload Any Los datos arbitrarios asociados al usuario durante el registro, como el correo electrónico o userId.

Ejemplo

Uso
app.js
JavaScript
const faceio = new faceIO("app-public-id"); // Inicializa fio.js con el Public ID de tu aplicación
function authenticateUser(){
  faceio.authenticate({
      "locale": "auto" // Idioma predeterminado del usuario
  }).then(userData => {
      console.log("Operación correcta, usuario identificado")
      // Obtén el Facial ID asociado a este usuario. Será el mismo
      // en cada autenticación posterior correcta. FACEIO recomienda 
      // utilizar este Facial ID para identificar de forma única 
      // a los usuarios registrados en tu backend.
      console.log("Facial ID asociado: " + userData.facialId)
      // Obtén los datos arbitrarios asociados previamente a este usuario
      // durante el registro mediante el parámetro payload de enroll().
      console.log("Payload: " + JSON.stringify(userData.payload)) // Datos del ejemplo de enroll() anterior
  }).catch(errCode => {
      handleError(errCode)
  })
}
Notas
  • Compara el facialId devuelto con tu base de datos antes de autorizar la sesión.
  • El payload del registro, como email o userId, está disponible en userData.payload. Aun así, valida la sesión en tu backend.
  • Consulta la plantilla HTML para ver una referencia completa.

restartSession() - Reiniciar la sesión

Reinicia la sesión actual de FACEIO para poder realizar una nueva llamada a enroll() o authenticate() en la misma página sin recargarla por completo. Resulta útil en terminales compartidos, puntos de registro en eventos u otros flujos donde varias personas utilizan la misma sesión del navegador de forma consecutiva.

Sintaxis

Firma
boolean = faceio.restartSession()
Parámetros
Ninguno. Este método no acepta argumentos.
Devuelve
true cuando la sesión se reinicia correctamente y está lista para una nueva operación; en caso contrario, false.

Descripción

Comportamiento

Una vez que enroll() o authenticate() se resuelve o se rechaza, la sesión interna de FACEIO queda consumida. Cualquier llamada posterior a uno de estos métodos en la misma instancia faceIO sin reiniciarla se rechazará inmediatamente con fioErrCode.SESSION_IN_PROGRESS.

Al llamar a restartSession() se elimina este estado y la instancia queda lista para otra operación de reconocimiento.

Casos de uso
  • Quiosco o terminal compartido - Permite que varios usuarios se autentiquen de forma consecutiva en el mismo dispositivo sin recargar la página.
  • Flujo de registro seguido de autenticación - Registra a un usuario y autentícalo en la misma página después de reiniciar la sesión.
  • Reintento después de un error - Reinicia la sesión después de una operación fallida para permitir otro intento sin actualizar la página.
Alcance
El reinicio afecta únicamente a una instancia faceIO. Si has creado varias instancias faceIO (no recomendado), cada una mantiene su propio estado de sesión.
Función Premium

La generación dinámica de sesiones está disponible únicamente en los planes Premium. Actualiza tu aplicación desde la FACEIO Console ↗ para utilizar esta función.

Valor devuelto

Resultado correcto
true - La sesión se reinició y la instancia está lista para una nueva llamada a enroll() o authenticate().
Error
false cuando no se pudo crear una sesión nueva.

Códigos de error - fioErrCode

Cuando enroll() o authenticate() fallan, la Promise se rechaza con un valor numérico fioErrCode. Gestiona los errores evaluando este valor dentro del controlador .catch(). Para restartSession(), comprueba el valor booleano devuelto (true o false).

Código Constante Descripción
1 fioErrCode.PERMISSION_REFUSED El usuario denegó el acceso a la cámara. Indícale cómo habilitarlo en la configuración del navegador.
2 fioErrCode.NO_FACES_DETECTED No se detectó ningún rostro dentro del tiempo de espera. Pide al usuario que se coloque frente a la cámara y vuelva a intentarlo.
3 fioErrCode.UNRECOGNIZED_FACE El rostro capturado no coincidió con ningún usuario registrado en la aplicación. Solo se produce durante la autenticación.
4 fioErrCode.MANY_FACES Se detectaron varios rostros al mismo tiempo. Solo debe aparecer uno en el encuadre.
5 fioErrCode.FACE_DUPLICATION El usuario intenta registrarse de nuevo, pero su rostro ya está registrado. Ocurre cuando la opción "Prevent Same User from Enrolling Twice" está habilitada en la FACEIO Console ↗. El registro se interrumpe; dirige al usuario al flujo de autenticación.
6 fioErrCode.MINORS_NOT_ALLOWED El registro fue rechazado por la política de edad mínima configurada. Muestra un mensaje adecuado y aplica la política de acceso del propietario de la aplicación.
7 fioErrCode.PAD_ATTACK Se detectó un posible ataque de presentación, como una foto, una reproducción de video o una máscara en lugar de un rostro en directo. Trátalo como una señal de seguridad y aplica tu política de reintento o revisión. Ningún sistema anti-spoofing detecta todos los intentos. Consulta más información sobre la detección de liveness ↗.
8 fioErrCode.FACE_MISMATCH Los vectores faciales capturados durante el registro no coincidieron entre sí. Solo se genera durante enroll(). Pide al usuario que vuelva a intentar el registro.
9 fioErrCode.NETWORK_IO Se produjo un error de red. Comprueba la conexión y vuelve a intentarlo.
10 fioErrCode.WRONG_PIN_CODE Se introdujo un PIN Code incorrecto durante la autenticación. Solo se genera durante authenticate(). La operación se interrumpe después de tres intentos fallidos. Permite que el usuario reinicie la autenticación.
11 fioErrCode.PROCESSING_ERR Error interno del servidor. Puede ser temporal; vuelve a intentar la operación después de una breve espera.
12 fioErrCode.UNAUTHORIZED El Public ID no es válido o la aplicación no está activada en FACEIO Console.
13 fioErrCode.TERMS_NOT_ACCEPTED El usuario no aceptó los Términos de servicio dentro del periodo definido por termsTimeout. Solo se produce durante el registro.
14 fioErrCode.UI_NOT_READY El Widget de FACEIO todavía no ha terminado de inicializarse. Espera a que el DOM se cargue por completo antes de invocar un método.
15 fioErrCode.UNIQUE_PIN_REQUIRED El PIN Code debe ser único entre todos los usuarios cuando está habilitada la comprobación de unicidad.
16 fioErrCode.TIMEOUT El servidor no respondió dentro del periodo definido por replyTimeout. Comprueba la conexión y vuelve a intentarlo.
17 fioErrCode.TOO_MANY_REQUESTS Se superó el límite de solicitudes. Implementa una espera exponencial antes de reintentar.
18 fioErrCode.EMPTY_ORIGIN Falta la cabecera de origen de la solicitud. Comprueba que fio.js se sirve desde un dominio válido.
19 fioErrCode.FORBIDDEN_ORIGIN El origen de la solicitud no está en la lista permitida. Añade el dominio en las opciones de seguridad de FACEIO Console.
20 fioErrCode.FORBIDDEN_COUNTRY El país del usuario está bloqueado por las restricciones geográficas de la aplicación configuradas en FACEIO Console.
21 fioErrCode.SESSION_IN_PROGRESS Ya hay un registro o una autenticación en curso. Puede ocurrir si enroll() o authenticate() se invoca varias veces, por ejemplo después de un doble clic. Utiliza restartSession() para iniciar una sesión nueva sin recargar la página. Si el Widget continúa activo, gestiona este estado sin iniciar otra operación.
22 fioErrCode.ABORTED_BY_USER El usuario pulsó el botón para cancelar o cerrar, disponible únicamente cuando showAbortBtn: true.

Práctica recomendada para el manejo de errores

Implementa el manejo de errores con mensajes claros para el usuario. Utiliza una instrucción switch o una cadena if-else para tratar cada código y orientar al usuario, por ejemplo, ofrecer el registro cuando se devuelve fioErrCode.UNRECOGNIZED_FACE.


Plantilla HTML

Una implementación de referencia con enroll() y authenticate() y manejo de errores. Utilízala como punto de partida para tu integración.

Importante

Sustituye app-public-id por el Public ID real de tu aplicación obtenido en la FACEIO Console ↗.

Plantilla de referencia

Notas de implementación

  • El enroll() de la línea 31 incluye un payload con datos de ejemplo. Adáptalo a las necesidades de tu sitio web o aplicación web.
  • Guarda el facialId en tu base de datos y asócialo a la cuenta del usuario para las autenticaciones posteriores.
  • El controlador de errores de la línea 60 cubre los códigos habituales. Adapta los mensajes al tono de tu sitio web o aplicación web.
  • Esta plantilla requiere un servidor HTTP en ejecución. fio.js no puede cargarse directamente desde el sistema de archivos local debido a las restricciones de seguridad del navegador.
  • Revisa las la guía de prácticas recomendadas de seguridad y la guía de prácticas recomendadas de privacidad antes de desplegar en producción.

Tutoriales de la comunidad

Utiliza estas guías aportadas por la comunidad para implementar fio.js con React, Vue, Angular, Next.js o JavaScript sin framework, y consulta ejemplos para proyectos de React Native y Flutter.

Paquete NPM oficial

Paquete oficial para herramientas de compilación de JavaScript y proyectos basados en frameworks.

Ver en NPM
Foro de la comunidad

Consulta respuestas, comparte experiencias y contacta con otros desarrolladores de FACEIO.

Abrir el foro
Autenticación sin contraseña centrada en la privacidad

Guía sobre inicio de sesión sin contraseña, verificación de edad y detección de liveness en una misma solución.

Ver tutorial
Sistema de asistencia facial (Vanilla JS)

Crea un flujo de control de asistencia con FACEIO y JavaScript sin framework.

Ver tutorial
Chatbot de IA con autenticación facial (Next.js)

Crea con Next.js un chatbot para planificar viajes con autenticación facial.

Ver tutorial
Reconocimiento facial con React y Tailwind

Añade reconocimiento facial a una aplicación creada con React y Tailwind CSS.

Ver tutorial
Reconocimiento facial en Vue.js

Tutorial para implementar la autenticación facial de FACEIO en una aplicación Vue.js.

Ver tutorial
Autenticar usuarios en React (freeCodeCamp)

Guía de freeCodeCamp para añadir autenticación por reconocimiento facial a una aplicación React.

Ver tutorial
Patrones modernos de autenticación web

Consulta patrones modernos de autenticación para aplicaciones web que utilizan reconocimiento facial.

Ver tutorial
Guía completa de FACEIO

Una guía detallada sobre la implementación de FACEIO y las prácticas recomendadas.

Ver tutorial
Inicio de sesión con reconocimiento facial (Vanilla JS)

Crea un flujo de inicio de sesión con reconocimiento facial y JavaScript sin framework.

Ver tutorial
Control de asistencia con FACEIO

Crea un sistema de control de asistencia basado en el reconocimiento facial de FACEIO.

Ver tutorial
¿Quieres compartir un tutorial?

Comparte un tutorial de implementación de FACEIO con la comunidad de desarrolladores.

Contáctanos

Integra FACEIO en 5 minutos

Crea una aplicación FACEIO, copia su Public ID, carga fio.js y conecta enroll() y authenticate() con los controles de registro e inicio de sesión de tu sitio web o aplicación web.

Sin tarjeta de crédito
Integración en 5 minutos
Independiente del framework