🔐 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

  1. Usuario completa formulario en RegisterScreen
  2. AuthService.register() envía datos a la API
  3. Backend PHP valida y crea usuario con token
  4. Usuario es redirigido a pantalla de login

2️⃣ Login de Usuario

  1. Usuario ingresa email y password en LoginScreen
  2. AuthService.login() autentica con la API
  3. Backend verifica credenciales y devuelve token
  4. Token se guarda y usuario accede a HomeScreen

3️⃣ Integración con FacturaScripts

  1. En FacturaScripts, se crea/edita un Cliente
  2. Campo password personalizado se completa
  3. Extensión Cliente.php intercepta el guardado
  4. Se crea automáticamente un ApiKey usando:
    • dni: CIF/NIF del cliente
    • description: Email del cliente
    • apikey: Password del cliente
  5. 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 User tipados

🔐 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 cliente
  • saveUpdate(): Se ejecuta al actualizar cliente
  • Usa Closure para inyectar lógica personalizada
  • Crea/actualiza ApiKey automáticamente

🔗 Cómo se Conectan Flutter y FacturaScripts

1

Crear Cliente en FacturaScripts

Admin añade cliente con email y password personalizado

2

Plugin Genera API Key

Extensión Cliente.php crea ApiKey automáticamente

apikey = password del cliente
3

Usuario Login en App

Usuario ingresa email y password en la app Flutter

4

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 password en 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 password no esté vacío
  • Revisa logs de FacturaScripts
  • Confirma que Init.php carga 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 baseUrl en api_config.dart
  • Usa http://10.0.2.2:8000 en 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)