Logotipo de la app Legal Age Verificación de ID y rostro

Legal Age — Verificación de Edad e Identidad (Flutter)

Legal Age es una app móvil moderna y lista para agencias que permite verificar mayoría de edad y confirmar identidad comparando una foto de documento de identidad con una selfie en vivo. Soporta dos proveedores en la nube (AWS + Azure) con failover automático, manteniendo los secretos del lado servidor para mayor seguridad y cumplimiento.

Caso de uso

Control de mayoría de edad, KYC ligero, contenido y comercio regulado.

Stack tecnológico

Flutter · Firebase (opcional) · AWS Rekognition · Azure Face API

Precio

Solo ofertas serias – incluye app, patrones de backend y documentación.

Funciones

Todo lo necesario para verificación de edad e ID en una sola app Flutter.

📸 Captura y coincidencia

  • Captura de foto de ID y selfie en vivo con la cámara.
  • Coincidencia de rostro entre la foto de ID y la selfie.
  • Decisión de mayoría de edad (18/21/personalizada) con mensajes claros.

🤖 Inteligencia en la nube

  • AWS Rekognition: CompareFaces y DetectFaces.
  • Azure Face API: verify y detect?returnFaceAttributes=age.
  • Estimación de edad con puntajes de confianza.

🧠 Failover automático

  • Proveedor primario configurable (AWS o Azure).
  • Failover automático ante errores de red/HTTP/parseo.
  • La UI muestra qué proveedor atendió el resultado final.

🎨 UI lista para agencias

  • Material 3, alto contraste y modo oscuro.
  • Flujos paso a paso con estados claros.
  • Resumen de resultados y textos explicativos para casos límite.

⚙️ Ajustes en tiempo de ejecución

  • Cambiar proveedor primario en tiempo real.
  • Sobrescribir bases/keys de API y headers de auth.
  • Configurar umbral de mayoría de edad; persistido con SharedPreferences.

🔐 Seguridad primero

  • Secretos del lado servidor; la app solo habla con tus proxies.
  • Hooks opcionales de auditoría (por ejemplo, logs en Firestore).
  • Guías claras para protección JWT y retención de datos.

Arquitectura general

Separación limpia entre app Flutter, servicios proxy y proveedores cloud.

Móvil (Flutter)

  • main.dart — entrada de la app, manejo global de errores, theming.
  • id_scanner_app.dart — shell con navegador privado.
  • id_scanner_home_page.dart — inicio con acciones rápidas.
  • main_screen.dart — resumen guiado y acceso a verificación.
  • face_verification_screen.dart — captura, verificación y resultados.
  • settings_screen.dart — proveedor, umbrales y overrides en runtime.

Backends (lado servidor)

  • AWS Lambda + API Gateway para Rekognition.
  • Azure Functions para Azure Face API.
  • Ambos exponen JSON normalizado para la app Flutter.

Flujo de datos

Cámara (ID y selfie) → App Flutter → Tu API Proxy (AWS o Azure). Si falla el primario, el orquestador cae al secundario y devuelve resultados normalizados: { matched, confidence, estimatedAge, ageConfidence, provider }.

Primeros pasos

Requisitos previos

  • Flutter 3.19+.
  • Xcode (iOS) y Android SDK (Android).
  • Cuentas de AWS y/o Azure para backends.

Dependencias clave

dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.2
  image_picker: ^1.1.2
  google_fonts: ^6.2.1
  shared_preferences: ^2.3.2
          

Configuración en tiempo de ejecución

Builds agnósticos de entorno usando --dart-define y overrides en la app.

Dart Define Ejemplo Propósito
AWS_API_BASE https://abc.execute-api.us-east-1.amazonaws.com/prod Base URL de API Gateway para Lambdas en AWS.
AZURE_FN_BASE https://your-fn.azurewebsites.net Base URL del Function App en Azure.
AZURE_FN_CODE … (opcional) Function key si tu nivel de auth lo requiere.
AUTH_BEARER eyJhbGciOiJI... JWT/ID token para tus gateways (opcional).
PRIMARY_PROVIDER aws o azure Proveedor preferido por defecto.

Todos estos valores se pueden sobrescribir en la pantalla de Ajustes y se persisten con SharedPreferences.

Permisos de plataforma

iOS — Info.plist

<key>NSCameraUsageDescription</key>
<string>Camera is used to capture ID photos and selfies for verification.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Photo library access is used to pick images for verification.</string>
          

Despliegue de backends

Patrones listos para AWS y Azure para tu equipo de infraestructura.

AWS: Rekognition + Lambda + API Gateway

Política IAM del rol de Lambda:

{
  "Version": "2012-10-17",
  "Statement": [
    {"Effect":"Allow","Action":["rekognition:CompareFaces","rekognition:DetectFaces"],"Resource":"*"},
    {"Effect":"Allow","Action":["s3:GetObject"],"Resource":"*"}
  ]
}
            
  • Crear dos Lambdas Node.js 20: POST /compare, POST /detect.
  • Conectarlas vía API HTTP en API Gateway con CORS habilitado.
  • Usar multipart form-data: idImage, selfieImage o image.

Pruebas de ejemplo:

curl -X POST "$AWS_API_BASE/compare" \
  -F idImage=@id.jpg -F selfieImage=@selfie.jpg

curl -X POST "$AWS_API_BASE/detect" \
  -F image=@selfie.jpg
            

Build y ejecución

Desarrollo

flutter pub get

flutter run \
  --dart-define=AWS_API_BASE=https://abc.execute-api.us-east-1.amazonaws.com/prod \
  --dart-define=AZURE_FN_BASE=https://your-fn.azurewebsites.net \
  --dart-define=PRIMARY_PROVIDER=aws
          

Release Android

flutter build apk --release \
  --dart-define=AWS_API_BASE=... \
  --dart-define=AZURE_FN_BASE=... \
  --dart-define=PRIMARY_PROVIDER=aws
# o:
# flutter build appbundle --release ...
          

Release iOS

flutter build ios --release \
  --dart-define=AWS_API_BASE=... \
  --dart-define=AZURE_FN_BASE=... \
  --dart-define=PRIMARY_PROVIDER=azure
# Luego archivar/firmar en Xcode como de costumbre
          

Testing y QA

Happy path

  • ID clara y selfie de la misma persona → matched=true, alta confianza.
  • Edad plausible a partir de la selfie con métricas de confianza.

Escenarios de failover

  • Deshabilitar temporalmente un backend → el otro debe responder con éxito.
  • La UI indica claramente “Fallback usado”.

Casos límite

  • Sin rostro detectado → matched=false, estimatedAge=null.
  • Varios rostros → se usa el primero; se pide repetir la foto.
  • Iluminación mala / oclusiones → menor confianza, pero mensajes seguros.

Resolución de problemas

  • AWS_API_BASE / AZURE_FN_BASE vacíos: Define via --dart-define o en Ajustes.
  • 403/401: Revisa AZURE_FN_CODE o la configuración JWT.
  • Errores CORS: Habilita CORS en API Gateway / Function App (para web).
  • Cámara denegada: Verifica permisos y prompts in-app.
  • “No hay proveedor disponible”: Fallaron ambos; revisa logs y red.
  • Usa los botones de “Ping” en Ajustes para probar conectividad rápida.