Demostración completa de Detección de Vida (Liveness Detection) utilizando Azure Face API. Incluye aplicaciones Web (Next.js) y Móvil (.NET MAUI).
Face Liveness es una tecnología de Azure AI que verifica si la persona frente a la cámara es real y está presente físicamente, protegiendo contra ataques de suplantación como:
| Ataque | Descripción | Protección |
|---|---|---|
| 📸 Foto impresa | Usar una fotografía de la víctima | ✅ Detectado |
| 📱 Foto digital | Mostrar foto desde otro dispositivo | ✅ Detectado |
| 🎬 Video pregrabado | Reproducir video de la víctima | ✅ Detectado |
| 🎭 Máscara 2D/3D | Usar máscara del rostro | ✅ Detectado |
| 🖼️ Deepfakes | Imágenes generadas por IA | ✅ Detectado |
- ✅ Detección de vida en tiempo real
- ✅ Verificación de identidad con imagen de referencia
- ✅ Interfaz moderna con Tailwind CSS
- ✅ API Routes seguras (server-side)
- ✅ Modo simulado para pruebas
- ✅ Multiplataforma: Android, iOS, Windows, macOS
- ✅ Captura de cámara nativa
- ✅ Selección de imagen de galería
- ✅ Patrón MVVM con CommunityToolkit
- ✅ UI optimizada para móviles
┌─────────────────────────────────────────────────────────────────────────────┐
│ FLUJO DE FACE LIVENESS │
└─────────────────────────────────────────────────────────────────────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ CLIENTE │ │ SERVIDOR │ │ AZURE FACE │
│ (Web/Móvil) │ │ (Backend) │ │ API │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
│ 1. Iniciar Liveness │ │
│───────────────────────>│ │
│ │ │
│ │ 2. Crear Sesión │
│ │───────────────────────>│
│ │ │
│ │ 3. SessionId + Token │
│ │<───────────────────────│
│ │ │
│ 4. Token de Acceso │ │
│<───────────────────────│ │
│ │ │
│ 5. Captura de Rostro │ │
│ (Cámara) │ │
│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─>│
│ │ │
│ │ │ 6. Análisis
│ │ │ de Vida
│ │ │
│ 7. Obtener Resultado │ │
│───────────────────────>│ │
│ │ 8. GET Session Result │
│ │───────────────────────>│
│ │ │
│ │ 9. Liveness Decision │
│ │<───────────────────────│
│ │ │
│ 10. Resultado Final │ │
│<───────────────────────│ │
│ │ │
┌──────┴───────┐ ┌──────┴───────┐ ┌──────┴───────┐
│ ✓ Persona │ │ │ │ │
│ Real │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
- Recurso de Azure Face API con Liveness habilitado
- Crear en Azure Portal
⚠️ Importante: Debes solicitar acceso a Liveness Detection en https://aka.ms/facerecognition
- Node.js v18 o superior
- npm o pnpm
- .NET 10 SDK
- Visual Studio 2022 con workload de .NET MAUI
- Android SDK / Xcode (según plataforma destino)
git clone https://github.com/eincioch/Azure-Face-Liveness.git
cd Azure-Face-Livenesscp .env.local.example .env.localEdita .env.local:
FACE_API_ENDPOINT=https://tu-recurso.cognitiveservices.azure.com
FACE_API_KEY=tu-clave-api-de-azurenpm install
npm run dev├── app/
│ ├── api/
│ │ ├── generateAccessToken/ # Crear sesiones de liveness
│ │ └── getSessionResult/ # Obtener resultados
│ ├── layout.tsx
│ └── page.tsx
├── components/
│ ├── FaceLivenessDemo.tsx # UI principal
│ ├── FaceLivenessDetector.tsx # SDK wrapper
│ └── FaceLivenessDetectorMock.tsx # Simulador
├── lib/
│ └── face-utils.ts # Utilidades
└── public/
└── icons/
cd AppmovilFaceLiveness/MauiAppFaceLivenessAbre MauiAppFaceLiveness.slnx en Visual Studio 2022.
Edita MauiProgram.cs y reemplaza las credenciales:
var faceApiConfig = new FaceApiConfig
{
Endpoint = "https://TU-RECURSO.cognitiveservices.azure.com",
ApiKey = "TU-API-KEY-AQUI"
};# Windows
dotnet build -f net10.0-windows10.0.19041.0
# Android
dotnet build -f net10.0-android
# iOS (requiere Mac)
dotnet build -f net10.0-iosAppmovilFaceLiveness/
└── MauiAppFaceLiveness/
├── Models/
│ └── LivenessModels.cs # Modelos de datos
├── Services/
│ ├── IFaceApiService.cs # Interfaz
│ └── FaceApiService.cs # Implementación HTTP
├── ViewModels/
│ ├── MainViewModel.cs # VM principal
│ └── LivenessDetectorViewModel.cs
├── Pages/
│ └── LivenessDetectorPage.xaml
├── Converters/
│ └── Converters.cs
├── Platforms/
│ ├── Android/AndroidManifest.xml # Permisos cámara
│ └── iOS/Info.plist # Permisos cámara
└── MauiProgram.cs # Configuración DI
| Modo | Descripción | Uso Recomendado |
|---|---|---|
| Passive | Detección automática sin interacción | Experiencia fluida, menor seguridad |
| PassiveActive | Requiere que el usuario siga instrucciones (girar cabeza) | Mayor seguridad, autenticación crítica |
Puedes combinar Liveness con verificación de identidad para confirmar que la persona es quien dice ser:
- Proporciona una imagen de referencia (foto de DNI, foto previa)
- El sistema compara el rostro capturado con la referencia
- Devuelve un score de confianza (0-1)
Liveness + Verify = Autenticación Biométrica Completa
┌────────────────────────────────────────────────────────────────┐
│ 🔒 NUNCA expongas tus API Keys en el código del cliente │
│ │
│ ✅ Usa variables de entorno │
│ ✅ Implementa las llamadas a Azure desde el backend │
│ ✅ Usa Azure Key Vault en producción │
│ ✅ Implementa autenticación de usuarios │
│ ✅ Agrega rate limiting │
└────────────────────────────────────────────────────────────────┘
- API Keys en Azure Key Vault
- HTTPS obligatorio
- Autenticación de usuarios (Azure AD, Auth0, etc.)
- Rate limiting en endpoints
- Logging y monitoreo (Application Insights)
- Validación de entrada en todos los endpoints
Si tu recurso de Azure no tiene Liveness habilitado, la aplicación web incluye un modo simulado que permite probar la UI sin conexión a Azure.
El componente FaceLivenessDetectorMock.tsx simula:
- Detección facial animada
- Resultados de liveness aleatorios
- Resultados de verificación
POST /api/generateAccessToken
Content-Type: application/json
{
"livenessOperationMode": "PassiveActive",
"deviceCorrelationId": "uuid-del-dispositivo"
}Respuesta:
{
"sessionId": "session-uuid",
"authToken": "jwt-token-para-sdk"
}POST /api/generateAccessToken
Content-Type: multipart/form-data
livenessOperationMode: PassiveActive
deviceCorrelationId: uuid-del-dispositivo
verifyImage: (archivo de imagen)GET /api/getSessionResult?sessionId=xxx&withVerify=trueRespuesta:
{
"isLive": true,
"livenessDecision": "realface",
"verifyResult": {
"isIdentical": true,
"matchConfidence": 0.95
}
}| Recurso | Enlace |
|---|---|
| Azure Face API Docs | learn.microsoft.com |
| Face Liveness Tutorial | aka.ms/azure-ai-vision-face-liveness-tutorial |
| SDK Web Reference | aka.ms/azure-ai-vision-face-liveness-client-sdk-web-api-reference |
| Azure Samples | github.com/Azure-Samples/azure-ai-vision-sdk |
| Solicitar Acceso Liveness | aka.ms/facerecognition |
Tu recurso de Azure Face API no tiene habilitado Liveness Detection.
Solicita acceso en: https://aka.ms/facerecognition
- Verifica
FACE_API_ENDPOINTyFACE_API_KEY - Comprueba que el recurso esté activo en Azure Portal
- Usa HTTPS (o localhost para desarrollo)
- Verifica permisos de cámara en navegador/dispositivo
- En Android: revisa
AndroidManifest.xml - En iOS: revisa
Info.plist
dotnet restore
dotnet clean
dotnet build- Fork el repositorio
- Crea tu feature branch (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add AmazingFeature') - Push al branch (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver LICENSE para más detalles.
Hecho con ❤️ para la comunidad de desarrolladores