|
|
@@ -0,0 +1,175 @@
|
|
|
+# Migración a Autenticación API UTB
|
|
|
+
|
|
|
+## Estado: ✅ Completado
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. Variables de Entorno
|
|
|
+
|
|
|
+### Archivo: `.env`
|
|
|
+
|
|
|
+- [x] Agregar `UTB_API_URL=https://sai.utb.edu.ec/v2/ws/auth/login`
|
|
|
+- [x] Agregar `UTB_API_APP_ID=6d834518ee8832b9455d3887aa0dc1a369bccee2d017812994ab066faae42067`
|
|
|
+- [x] Agregar `UTB_API_APP_TOKEN=c9449f3452c6645081282a01240c0679eb1ca1e440eebf322eb23d5f2260c2d4`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. Configuración
|
|
|
+
|
|
|
+### Archivo: `src/lib/config.ts`
|
|
|
+
|
|
|
+- [x] Agregar sección `utbApi`
|
|
|
+- [x] Agregar validación de credenciales en logger
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. Cliente API UTB
|
|
|
+
|
|
|
+### Archivo: `src/lib/utb-api.ts` (nuevo)
|
|
|
+
|
|
|
+- [x] Crear función `authenticateUser(username: string, password: string)`
|
|
|
+- [x] Configurar headers: `X-App-Id`, `X-App-Token`, `Content-Type`
|
|
|
+- [x] Manejo de respuesta exitosa (200)
|
|
|
+- [x] Manejo de errores (400, 401, 405)
|
|
|
+- [x] Retornar interface `UTBAuthResponse`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. Schema Prisma
|
|
|
+
|
|
|
+### Archivo: `prisma/schema.prisma`
|
|
|
+
|
|
|
+- [x] Agregar campo `identificacion String? @unique` al modelo `User`
|
|
|
+- [x] Agregar campo `isExternalAuth Boolean @default(false)` al modelo `User`
|
|
|
+- [x] Modificar `email String? @unique` (hacerlo opcional)
|
|
|
+- [x] Modificar `password String?` (hacerlo opcional)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. Migración Base de Datos
|
|
|
+
|
|
|
+- [x] Ejecutar `npx prisma migrate dev --name add_utb_fields`
|
|
|
+- [x] Verificar que la migración se aplicó correctamente
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. Lógica de Autenticación
|
|
|
+
|
|
|
+### Archivo: `src/lib/auth.ts`
|
|
|
+
|
|
|
+- [x] Importar cliente UTB API
|
|
|
+- [x] Modificar `authorize()`:
|
|
|
+ - [x] Validar contra API UTB (no bcrypt)
|
|
|
+ - [x] Buscar usuario por `identificacion` o `username`
|
|
|
+ - [x] Si no existe, crear usuario nuevo
|
|
|
+ - [x] Mapear datos de API a modelo User
|
|
|
+ - [x] Mapear roles: ESTUDIANTE→PATIENT, DOCENTE→DOCTOR, ADMINISTRADOR→ADMIN
|
|
|
+ - [x] Si existe, actualizar datos desde API
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. Formulario de Login
|
|
|
+
|
|
|
+### Archivo: `src/app/auth/login/page.tsx`
|
|
|
+
|
|
|
+- [x] Cambiar campo `email` por `username`
|
|
|
+- [x] Actualizar labels y placeholders
|
|
|
+- [x] Actualizar mensaje informativo
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. API Account Update
|
|
|
+
|
|
|
+### Archivo: `src/app/api/account/update/route.ts`
|
|
|
+
|
|
|
+- [x] Prevenir cambio de contraseña para usuarios UTB
|
|
|
+- [x] Validar que `password` no sea null antes de bcrypt.compare
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 9. Tipos TypeScript
|
|
|
+
|
|
|
+### Archivo: `src/types/utb-api.d.ts` (nuevo)
|
|
|
+
|
|
|
+- [x] Definir `UTBAuthResponse`
|
|
|
+- [x] Definir `UTBUser`
|
|
|
+- [x] Definir `UTBErrorResponse`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 10. Build y Pruebas
|
|
|
+
|
|
|
+- [x] Verificar que el proyecto compila sin errores
|
|
|
+- [x] Probar login con usuario estudiante
|
|
|
+- [x] Probar login con usuario docente
|
|
|
+- [x] Verificar creación de usuario en DB
|
|
|
+- [x] Verificar actualización de datos existentes
|
|
|
+- [x] Probar manejo de credenciales inválidas
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 11. UI de Cuenta
|
|
|
+
|
|
|
+### Archivos: `src/components/account/*.tsx`, `src/app/account/page.tsx`
|
|
|
+
|
|
|
+- [x] Banner informativo para usuarios UTB
|
|
|
+- [x] Mostrar `identificacion` (solo lectura)
|
|
|
+- [x] Bloquear campos nombre/apellido para usuarios UTB
|
|
|
+- [x] Email opcional y editable
|
|
|
+- [x] Deshabilitar cambio de contraseña para usuarios UTB
|
|
|
+- [x] Link a SAI UTB para cambios
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Estado Final: ✅ COMPLETADO Y SIMPLIFICADO
|
|
|
+
|
|
|
+**Migración exitosa a autenticación API UTB.**
|
|
|
+
|
|
|
+### Simplificación UTB-Only (100% dependencia API)
|
|
|
+
|
|
|
+**Decisión:** El sistema ya no soporta usuarios locales. Todos los usuarios deben autenticarse mediante la API de UTB.
|
|
|
+
|
|
|
+**Cambios de simplificación realizados:**
|
|
|
+
|
|
|
+1. **Componentes de cuenta simplificados:**
|
|
|
+ - `PersonalInfoSection.tsx`: Siempre muestra banner UTB, campos nombre/apellido bloqueados
|
|
|
+ - `PasswordChangeSection.tsx`: Solo muestra mensaje de gestión por UTB, sin campos de contraseña
|
|
|
+
|
|
|
+2. **API de actualización simplificada:**
|
|
|
+ - Eliminados checks de `isExternalAuth`
|
|
|
+ - Solo permite actualizar: email y profileImage
|
|
|
+ - Bloquea cualquier intento de cambio de contraseña
|
|
|
+ - Removidos imports y lógica de bcrypt no utilizados
|
|
|
+
|
|
|
+3. **Props simplificadas:**
|
|
|
+ - Eliminado prop `isExternalAuth` de componentes de cuenta
|
|
|
+ - Props de contraseña en `PasswordChangeSection` marcadas como opcionales por compatibilidad
|
|
|
+
|
|
|
+**Estado actual:**
|
|
|
+- ✅ Autenticación mediante API externa
|
|
|
+- ✅ Sincronización automática de datos
|
|
|
+- ✅ Protección de campos gestionados por UTB
|
|
|
+- ✅ UI simplificada sin lógica condicional
|
|
|
+- ✅ Build exitoso sin errores
|
|
|
+- ✅ Código más limpio y mantenible
|
|
|
+
|
|
|
+**Campos editables:**
|
|
|
+- ✅ Email (opcional)
|
|
|
+- ✅ Foto de perfil
|
|
|
+
|
|
|
+**Campos bloqueados (gestionados por UTB):**
|
|
|
+- 🔒 Nombre
|
|
|
+- 🔒 Apellido
|
|
|
+- 🔒 Fecha de nacimiento
|
|
|
+- 🔒 Contraseña
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Notas Importantes
|
|
|
+
|
|
|
+- **Email opcional:** Los usuarios pueden agregarlo después en `/account`
|
|
|
+- **Password:** Se guarda vacío para usuarios UTB (no se usa)
|
|
|
+- **Identificación:** Campo único que vincula con API UTB
|
|
|
+- **Roles:** Mapeo automático según `tipo` de la API
|
|
|
+- **Reportes:** Se mantienen vinculados por `userId` interno
|
|
|
+- **Sin usuarios locales:** Ya no se soporta autenticación local, solo UTB
|