UTB_API_MIGRATION.md 4.8 KB

Migración a Autenticación API UTB

Estado: ✅ Completado


1. Variables de Entorno

Archivo: .env

  • Agregar UTB_API_URL=https://sai.utb.edu.ec/v2/ws/auth/login
  • Agregar UTB_API_APP_ID=6d834518ee8832b9455d3887aa0dc1a369bccee2d017812994ab066faae42067
  • Agregar UTB_API_APP_TOKEN=c9449f3452c6645081282a01240c0679eb1ca1e440eebf322eb23d5f2260c2d4

2. Configuración

Archivo: src/lib/config.ts

  • Agregar sección utbApi
  • Agregar validación de credenciales en logger

3. Cliente API UTB

Archivo: src/lib/utb-api.ts (nuevo)

  • Crear función authenticateUser(username: string, password: string)
  • Configurar headers: X-App-Id, X-App-Token, Content-Type
  • Manejo de respuesta exitosa (200)
  • Manejo de errores (400, 401, 405)
  • Retornar interface UTBAuthResponse

4. Schema Prisma

Archivo: prisma/schema.prisma

  • Agregar campo identificacion String? @unique al modelo User
  • Agregar campo isExternalAuth Boolean @default(false) al modelo User
  • Modificar email String? @unique (hacerlo opcional)
  • Modificar password String? (hacerlo opcional)

5. Migración Base de Datos

  • Ejecutar npx prisma migrate dev --name add_utb_fields
  • Verificar que la migración se aplicó correctamente

6. Lógica de Autenticación

Archivo: src/lib/auth.ts

  • Importar cliente UTB API
  • Modificar authorize():
    • Validar contra API UTB (no bcrypt)
    • Buscar usuario por identificacion o username
    • Si no existe, crear usuario nuevo
    • Mapear datos de API a modelo User
    • Mapear roles: ESTUDIANTE→PATIENT, DOCENTE→DOCTOR, ADMINISTRADOR→ADMIN
    • Si existe, actualizar datos desde API

7. Formulario de Login

Archivo: src/app/auth/login/page.tsx

  • Cambiar campo email por username
  • Actualizar labels y placeholders
  • Actualizar mensaje informativo

8. API Account Update

Archivo: src/app/api/account/update/route.ts

  • Prevenir cambio de contraseña para usuarios UTB
  • Validar que password no sea null antes de bcrypt.compare

9. Tipos TypeScript

Archivo: src/types/utb-api.d.ts (nuevo)

  • Definir UTBAuthResponse
  • Definir UTBUser
  • Definir UTBErrorResponse

10. Build y Pruebas

  • Verificar que el proyecto compila sin errores
  • Probar login con usuario estudiante
  • Probar login con usuario docente
  • Verificar creación de usuario en DB
  • Verificar actualización de datos existentes
  • Probar manejo de credenciales inválidas

11. UI de Cuenta

Archivos: src/components/account/*.tsx, src/app/account/page.tsx

  • Banner informativo para usuarios UTB
  • Mostrar identificacion (solo lectura)
  • Bloquear campos nombre/apellido para usuarios UTB
  • Email opcional y editable
  • Deshabilitar cambio de contraseña para usuarios UTB
  • 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