Saltar a contenido

Autenticacion

MDU usa su propio sistema de autenticacion basado en JWT con dos metodos de login: Email OTP y Google OAuth.

Vision General

  • Token de acceso: JWT de corta duracion (HMAC-SHA256)
  • Token de refresco: JWT de larga duracion para renovacion
  • Almacenamiento: claves localStorage mdu_access_token, mdu_refresh_token, mdu_user
  • Header: Authorization: Bearer <access_token>

Endpoints

Metodo Ruta Auth Descripcion
POST /api/auth/send-otp - Enviar OTP de 6 digitos al email
POST /api/auth/verify-otp - Verificar OTP, devolver JWT
GET /api/auth/google - Redireccion Google OAuth
GET /api/auth/google/callback - Callback Google OAuth
POST /api/auth/refresh - Refrescar token de acceso
POST /api/auth/logout Requerido Invalidar token de refresco

Flujo OTP por Email

1. Enviar OTP

POST /api/auth/send-otp
Content-Type: application/json

{ "email": "usuario@ejemplo.com" }

Respuesta:

{ "success": true }

Reglas:

  • Codigo numerico de 6 digitos
  • Expira en 10 minutos
  • Maximo 3 envios por 10 minutos por email

2. Verificar OTP

POST /api/auth/verify-otp
Content-Type: application/json

{ "email": "usuario@ejemplo.com", "code": "123456" }

Respuesta:

{
  "access_token": "eyJhbGci...",
  "refresh_token": "eyJhbGci...",
  "user": { "id": "uuid", "email": "usuario@ejemplo.com", "name": "Usuario" }
}

Flujo Google OAuth

1. Redirigir a Google

GET /api/auth/google?redirect=https://app.minidreamuniverse.com/create

Redirige al usuario a la pantalla de consentimiento OAuth de Google. El parametro opcional redirect define donde volver despues de la autenticacion.

2. Callback

Google redirige de vuelta a /api/auth/google/callback con un codigo de autorizacion. El servidor lo intercambia por informacion del usuario, crea/actualiza el perfil, genera tokens JWT y redirige al frontend con tokens en el hash de la URL.

Refresco de Token

POST /api/auth/refresh
Content-Type: application/json

{ "refresh_token": "eyJhbGci..." }

Respuesta:

{
  "access_token": "eyJhbGci...",
  "refresh_token": "eyJhbGci..."
}

Payload JWT

{
  "sub": "user-uuid",
  "email": "usuario@ejemplo.com",
  "iat": 1709800000,
  "exp": 1709803600
}

Warning

El ID del usuario esta en payload.sub, NO en payload.userId. Todo el middleware extrae req.userId = payload.sub.

Integracion Frontend

// authService.ts
const token = localStorage.getItem('mdu_access_token');

// Llamadas API
const response = await fetch('/api/generate-model', {
  headers: { 'Authorization': `Bearer ${token}` }
});

// Refresco de token en 401
if (response.status === 401) {
  const newToken = await refreshToken();
  // Reintentar peticion con nuevo token
}

El helper getValidToken() en authService.ts gestiona la verificacion de expiracion JWT y el refresco automatico.

Logout

POST /api/auth/logout
Authorization: Bearer <access_token>

Limpia el token de refresco en el servidor. El frontend limpia localStorage y despacha el CustomEvent mdu:auth:logout.