🔐 Sistema de Registro y Login
App Flutter conectada con API PHP y Plugin FacturaScripts
Descargar Ejemplos Completos📱 ¿Qué es este sistema?
Sistema Completo de Autenticación
Esta aplicación Flutter demuestra cómo crear un sistema completo de registro y login que se integra con:
- Backend PHP simple: API REST para autenticación básica
- Plugin FacturaScripts: Extensión que crea API Keys automáticamente
- App Flutter: Interfaz móvil con pantallas de registro, login y home
- Gestión de estado: Control de sesión y tokens de autenticación
Arquitectura del Sistema
- 📱 Frontend Flutter: Pantallas y servicios de autenticación
- 🔌 API PHP: Backend de ejemplo con JWT/tokens
- 🏢 Plugin FacturaScripts: Extensión del modelo Cliente para generar API Keys
- 🔗 Conexión: El password del cliente se usa como API Key en FacturaScripts
📁 Estructura del Proyecto
RegistroLogin/
├── lib/ # Aplicación Flutter
│ ├── config/
│ │ └── api_config.dart # Configuración de endpoints
│ ├── models/
│ │ └── user.dart # Modelo de Usuario
│ ├── services/
│ │ └── auth_service.dart # Servicio de autenticación
│ ├── screens/
│ │ ├── register_screen.dart # Pantalla de registro
│ │ ├── login_screen.dart # Pantalla de login
│ │ └── home_screen.dart # Pantalla principal
│ ├── backend_ejemplo/
│ │ └── api.php # Backend PHP de ejemplo
│ └── main.dart # Punto de entrada
│
└── ReparacionesRK/ # Plugin FacturaScripts
├── facturascripts.ini # Configuración del plugin
├── Init.php # Inicialización
├── Extension/
│ └── Model/
│ └── Cliente.php # Extensión del modelo Cliente
├── Model/
├── Controller/
└── XMLView/
🔍 Explora los Componentes
Haz clic en cualquier componente para ver su código completo:
Punto de Entrada
main.dart
Ver código →Configuración API
api_config.dart
Ver código →Modelo User
user.dart
Ver código →Auth Service
auth_service.dart
Ver código →Pantalla Login
login_screen.dart
Ver código →Pantalla Registro
register_screen.dart
Ver código →Pantalla Home
home_screen.dart
Ver código →Backend PHP
api.php
Ver código →Extensión Cliente
Cliente.php
Ver código →Init Plugin
Init.php
Ver código →Config Plugin
facturascripts.ini
Ver código →🔄 Flujo de Funcionamiento
1️⃣ Registro de Usuario
- Usuario completa formulario en
RegisterScreen AuthService.register()envía datos a la API- Backend PHP valida y crea usuario con token
- Usuario es redirigido a pantalla de login
2️⃣ Login de Usuario
- Usuario ingresa email y password en
LoginScreen AuthService.login()autentica con la API- Backend verifica credenciales y devuelve token
- Token se guarda y usuario accede a
HomeScreen
3️⃣ Integración con FacturaScripts
- En FacturaScripts, se crea/edita un Cliente
- Campo
passwordpersonalizado se completa - Extensión
Cliente.phpintercepta el guardado - Se crea automáticamente un
ApiKeyusando:- dni: CIF/NIF del cliente
- description: Email del cliente
- apikey: Password del cliente
- App Flutter puede usar ese password para autenticarse con FacturaScripts
🔧 Explicación Técnica Detallada
🎯 Patrón Service Layer
AuthService centraliza toda la lógica de autenticación:
- Abstrae las peticiones HTTP
- Gestiona errores de forma centralizada
- Serializa/deserializa JSON automáticamente
- Devuelve objetos
Usertipados
🔐 Gestión de Tokens
El sistema usa tokens Bearer para autenticación:
- Generados en backend con
bin2hex(random_bytes(32)) - Enviados en header
Authorization: Bearer {token} - Validados en cada petición protegida
- Almacenados en la app (SharedPreferences recomendado)
🏗️ Extensión de Modelos
Plugin FacturaScripts extiende el modelo Cliente:
saveInsert(): Se ejecuta al crear clientesaveUpdate(): Se ejecuta al actualizar cliente- Usa
Closurepara inyectar lógica personalizada - Crea/actualiza
ApiKeyautomáticamente
🔗 Cómo se Conectan Flutter y FacturaScripts
Crear Cliente en FacturaScripts
Admin añade cliente con email y password personalizado
Plugin Genera API Key
Extensión Cliente.php crea ApiKey automáticamente
apikey = password del cliente
Usuario Login en App
Usuario ingresa email y password en la app Flutter
App Accede a FacturaScripts
Flutter usa el password como token en header:
token: {password}
📋 Requisitos y Dependencias
Flutter (pubspec.yaml)
dependencies:
flutter:
sdk: flutter
http: ^1.1.0 # Peticiones HTTP
provider: ^6.0.0 # Gestión de estado (opcional)
shared_preferences: ^2.0.0 # Persistencia de token
Backend PHP
- PHP 7.4 o superior
- Extensión JSON habilitada
- Extensión OpenSSL para tokens
- Headers CORS configurados
FacturaScripts
- FacturaScripts 2024 o superior
- Plugin instalado en
/Plugins/ReparacionesRK/ - Campo personalizado
passworden modelo Cliente - API habilitada en configuración
✅ Mejores Prácticas Implementadas
🛡️ Seguridad
- Passwords hasheados con
password_hash() - Tokens aleatorios seguros
- Validación en cliente y servidor
- Headers CORS configurados
- Sin passwords en respuestas
🎨 UX/UI
- Indicadores de carga (
_isLoading) - Validación de formularios en tiempo real
- SnackBars para feedback al usuario
- Navegación fluida entre pantallas
- TextFormField con validators
🏗️ Arquitectura
- Separación de capas (UI, Service, Model)
- Configuración centralizada
- Código reutilizable y mantenible
- Gestión de errores consistente
- Logs informativos en backend y plugin
🔧 Solución de Problemas Comunes
❌ Error de CORS
Síntoma: "CORS policy blocked"
Solución:
- Verifica headers en
api.php - Asegura que
Access-Control-Allow-Origin: *esté presente - Maneja peticiones OPTIONS (preflight)
🔐 API Key no se crea
Síntoma: Cliente guardado pero sin ApiKey
Solución:
- Verifica que el campo
passwordno esté vacío - Revisa logs de FacturaScripts
- Confirma que
Init.phpcarga la extensión - Comprueba permisos de escritura en BD
📱 App no conecta
Síntoma: "Connection refused"
Solución:
- En dispositivo físico, usa IP real (no localhost)
- Verifica que el servidor esté corriendo
- Comprueba
baseUrlenapi_config.dart - Usa
http://10.0.2.2:8000en emulador Android
🔑 Token inválido
Síntoma: "Error 401: Token inválido"
Solución:
- Verifica formato:
Bearer {token} - Confirma que el token se guarda correctamente
- Revisa que no haya espacios extra
- Valida que el token exista en users.json
🚀 Mejoras Sugeridas
1. Persistencia de Sesión
Implementar SharedPreferences para mantener al usuario logueado:
- Guardar token al hacer login
- Verificar token al iniciar app
- Limpiar token al hacer logout
- Auto-login si token es válido
2. Gestión de Estado
Usar Provider, Riverpod o BLoC para gestionar el estado global:
- AuthProvider con estado de usuario
- Loading states centralizados
- Navegación condicional según estado
- Refresh automático de datos
3. Base de Datos Real
Migrar de JSON a MySQL/PostgreSQL:
- Tablas relacionales para usuarios
- Índices para búsquedas rápidas
- Transacciones ACID
- Backups automatizados
4. Seguridad Avanzada
- JWT con expiración automática
- Refresh tokens
- Rate limiting en API
- Validación de email con código
- 2FA (autenticación de dos factores)