Descripción General
ServicioVerificacionCliente maneja la verificación de identidad de clientes mediante SMS sin crear sesiones permanentes. Está diseñado para el flujo de reservas públicas donde los clientes verifican su teléfono, hacen una reserva, y luego la sesión se cierra automáticamente.
Ubicación: lib/adaptadores/servicio_verificacion_cliente.dart
Características Principales
- Verificación por SMS sin login permanente
- Soporte para web (reCAPTCHA) y móvil
- Normalización de números argentinos a formato E.164
- Almacenamiento local de reservas en localStorage
- Sesiones temporales de cliente (30 días)
- Limpieza automática de reCAPTCHA
Diferencias con ServicioAutenticacion
| Característica | ServicioVerificacionCliente | ServicioAutenticacion |
|---|---|---|
| Propósito | Verificación temporal para reservas | Login permanente de usuarios |
| Sesión | Se cierra después de verificar | Permanece activa |
| Almacenamiento | localStorage (cliente) | Firestore (servidor) |
| Uso típico | Clientes haciendo reservas | Dueños y administradores |
| Email required | No | Sí |
Verificación SMS
enviarCodigoSMS
- Web: Usa reCAPTCHA invisible y
signInWithPhoneNumber - Móvil: Usa
verifyPhoneNumbertradicional - Android: Puede verificarse automáticamente sin ingresar código
telefono- Número en formato local o E.164 (se normaliza automáticamente)onCodigoEnviado- Callback cuando el SMS se envíaonError- Callback en caso de erroronVerificacionAutomatica- Callback si se verifica automáticamente (solo Android)
true si el proceso inició correctamente
Ejemplo en Web:
verificarCodigoSMS
codigo- Código de 6 dígitos recibido por SMS
+5492622123456)
Excepciones:
invalid-verification-code- Código incorrectosession-expired- El código expiró (solicitar uno nuevo)
limpiarRecaptcha
Normalización de Teléfono
normalizarTelefono
- Remueve espacios, guiones y paréntesis
- Si no tiene
+, agrega+54(Argentina) - Remueve
0inicial si existe - Convierte formato local
15a formato internacional9 - Asegura que tenga el
9después del código de área
validarTelefono
- Longitud correcta para Argentina (13-14 dígitos)
- Debe empezar con
+54 - Formato E.164 válido
Almacenamiento Local de Reservas
Las reservas se guardan en
localStorage del navegador para que el cliente pueda ver sus reservas sin necesidad de login.guardarReserva
obtenerTodasReservas
obtenerReservasPorTelefono
telefono- Teléfono en cualquier formato (se normaliza automáticamente)
Sesión Temporal del Cliente
Las sesiones temporales permiten que el cliente no tenga que verificar su teléfono cada vez que visita la página. Expiran después de 30 días.
guardarSesionCliente
obtenerSesionCliente
limpiarSesionCliente
Manejo de reCAPTCHA (Web)
¿Qué es reCAPTCHA?
En la web, Firebase requiere reCAPTCHA para verificar que el usuario es humano antes de enviar SMS. El servicio maneja esto automáticamente.Tipos de reCAPTCHA
- Invisible: Se ejecuta en segundo plano (usado por defecto)
- Checkbox: Muestra el típico “No soy un robot”
- Modal: Aparece un popup de verificación
- Usa reCAPTCHA invisible (sin contenedor HTML)
- Firebase puede mostrar un modal automáticamente si detecta actividad sospechosa
- Se limpia automáticamente después de verificar
Limpieza Automática
El servicio limpia el reCAPTCHA automáticamente en estos casos:- Después de verificar el código exitosamente
- Si hay un error en la verificación
- Si se llama manualmente a
limpiarRecaptcha()
Troubleshooting reCAPTCHA
reCAPTCHA no desaparece
reCAPTCHA no desaparece
Solución:
Error 'captcha-check-failed'
Error 'captcha-check-failed'
Causas comunes:
- reCAPTCHA de Firebase no configurado correctamente
- Dominio no autorizado en Firebase Console
- Ir a Firebase Console > Authentication > Sign-in method
- En Phone, agregar tu dominio a la lista de autorizados
- Recarga la página e intenta de nuevo
reCAPTCHA aparece repetidamente
reCAPTCHA aparece repetidamente
Solución:
Flujo Completo de Verificación
Diagrama del Flujo
Código Completo del Flujo
Errores Comunes
Códigos de Error de Firebase
| Código | Descripción | Solución |
|---|---|---|
invalid-phone-number | Número no válido | Usar formato correcto: +54 9 2622 123456 |
too-many-requests | Demasiados intentos | Esperar unos minutos antes de reintentar |
quota-exceeded | Límite de SMS excedido | Verificar cuota en Firebase Console |
captcha-check-failed | reCAPTCHA falló | Agregar dominio a lista autorizada en Firebase |
invalid-verification-code | Código incorrecto | Verificar que el código sea correcto |
session-expired | Verificación expiró | Solicitar un nuevo código |
Configuración de Firebase
Habilitar Phone Authentication
- Firebase Console > Authentication > Sign-in method
- Habilitar Phone
- Agregar dominios autorizados (para web)
Configurar Cuota de SMS
Cuota gratuita: ~10 SMS por día Costos (pueden variar):- Argentina: ~$0.04 USD por SMS
- Verificaciones fallidas no se cobran
Dominios Autorizados (Web)
Para que reCAPTCHA funcione en web:- Firebase Console > Authentication > Settings
- En “Authorized domains”, agregar:
localhost(para desarrollo)tu-dominio.com(para producción)- Cualquier dominio donde esté desplegada la app
Mejores Prácticas
Validar Antes de Enviar
Limpiar reCAPTCHA
Manejar Sesiones
No Persistir Sesión en Firebase
Ver También
- Servicio Autenticación - Para login permanente de usuarios
- Servicio Email - Para enviar confirmaciones por email
- Firebase Phone Authentication - Documentación oficial