Saltar al contenido principal

Autenticación

Base path: /api/auth

POST /auth/login

Iniciar sesión con email y contraseña.

Auth: Ninguna

Request body:

CampoTipoObligatorioDescripción
emailstringDirección de email
passwordstringContraseña
mobilebooleanNoSi true, se devuelve un refresh token de 30 días

Response (200):

{
"token": "jwt-access-token",
"refresh_token": "solo-cuando-mobile-true",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}

Los access tokens expiran a las 8 horas. Con mobile: true se devuelve también un refresh token (válido 30 días).

Errores: 401 — Credenciales inválidas


POST /auth/logout

Cerrar sesión y revocar refresh/device token.

Auth: Requerida (cualquier rol)

Request body:

CampoTipoDescripción
refresh_tokenstringRefresh token a revocar
device_tokenstringDevice token push a eliminar

POST /auth/refresh

Renovar access token mediante refresh token. El token antiguo se elimina y se emite uno nuevo (rotación de tokens).

Auth: Ninguna

Request body:

CampoTipoObligatorio
refresh_tokenstring

Response (200):

{
"token": "nuevo-access-token",
"refresh_token": "nuevo-refresh-token",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}

Errores: 401 — Refresh token inválido o expirado


POST /auth/register

Crear nuevo usuario (solo admin). Envía email de bienvenida con contraseña temporal. El nuevo usuario tendrá require_password_change: true.

Auth: Admin

Request body:

CampoTipoObligatorioPor defecto
emailstring
namestring
rolestringNostaff

Response (200): { id, email, role, name }

Errores: 409 — Email ya registrado


POST /auth/forgot-password

Enviar email de restablecimiento de contraseña. Siempre devuelve 200 (evita enumeración de emails). Los enlaces expiran a la 1 hora.

Auth: Ninguna

Request body: { "email": "user@example.com" }


POST /auth/reset-password

Restablecer contraseña con token del email de restablecimiento.

Auth: Ninguna

Request body:

CampoTipoObligatorio
emailstring
tokenstring
passwordstring (min 8)

Errores: 400 — Token inválido o expirado


POST /auth/change-password

Cambiar contraseña para usuario autenticado.

Auth: Requerida (cualquier rol)

Request body:

CampoTipoObligatorio
emailstring
currentPasswordstring
newPasswordstring (min 8)
confirmPasswordstring (min 8)

Errores: 400 — Las contraseñas no coinciden; 401 — Contraseña actual incorrecta


GET /auth/users

Obtener todos los usuarios (solo admin).

Auth: Admin

Response: Array de objetos { id, name, email, role }.


POST /auth/device

Registrar device token para notificaciones push.

Auth: Requerida

Request body:

CampoTipoObligatorio
tokenstring (max 512)
platformios / android / web

DELETE /auth/device

Eliminar un device token.

Auth: Requerida

Request body: { "token": "device-token" }


GET /auth/setup-status

Verificar si se requiere la configuración inicial.

Auth: Ninguna

Response:

{ "needsSetup": true }

POST /auth/setup

Endpoint de configuración inicial. Solo funciona cuando no existen cuentas de usuario.

Auth: Ninguna

Request body:

CampoTipoObligatorioDescripción
admin_namestringNombre del admin
admin_emailstringEmail del admin
admin_passwordstring (min 8)Contraseña
salon_namestringNombre del salón
salon_emailstringNoEmail de contacto
salon_phonestringNoTeléfono
salon_addressstringNoDirección
opening_hoursarrayNoArray de { day_of_week, open_time, close_time, is_closed }

Response (201):

{
"token": "jwt-access-token",
"user": { "id": 1, "name": "Admin", "role": "admin" }
}

Errores: 400 — Configuración ya completada