Authenticatie
Base path: /api/auth
POST /auth/login
Inloggen met e-mail en wachtwoord.
Auth: Geen
Request body:
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
email | string | Ja | E-mailadres |
password | string | Ja | Wachtwoord |
mobile | boolean | Nee | Als true, wordt een 30-dagen refresh token teruggegeven |
Response (200):
{
"token": "jwt-access-token",
"refresh_token": "alleen-bij-mobile-true",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Access tokens verlopen na 8 uur. Bij mobile: true wordt ook een refresh token (30 dagen geldig) teruggegeven en opgeslagen in refresh_tokens.
Fouten: 401 — Ongeldige inloggegevens
POST /auth/logout
Uitloggen en refresh/device token intrekken.
Auth: Verplicht (elke rol)
Request body:
| Veld | Type | Beschrijving |
|---|---|---|
refresh_token | string | Refresh token om in te trekken |
device_token | string | Push device token om te verwijderen |
Beide velden zijn optioneel; stuur welke tokens ingetrokken moeten worden.
POST /auth/refresh
Access token vernieuwen via refresh token. Het oude token wordt verwijderd en een nieuw token wordt aangemaakt (token rotatie).
Auth: Geen
Request body:
| Veld | Type | Verplicht |
|---|---|---|
refresh_token | string | Ja |
Response (200):
{
"token": "nieuw-access-token",
"refresh_token": "nieuw-refresh-token",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Fouten: 401 — Ongeldige of verlopen refresh token
POST /auth/register
Nieuwe gebruiker aanmaken (admin only). Stuurt welkomstmail met tijdelijk wachtwoord. De nieuwe gebruiker heeft require_password_change: true.
Auth: Admin
Request body:
| Veld | Type | Verplicht | Default |
|---|---|---|---|
email | string | Ja | — |
name | string | Ja | — |
role | string | Nee | staff |
Response (200): { id, email, role, name }
Fouten: 409 — E-mailadres al geregistreerd
POST /auth/forgot-password
Wachtwoord reset e-mail versturen. Retourneert altijd 200 (voorkomt e-mail enumeratie). Reset-links verlopen na 1 uur. Throttle van 60 seconden voorkomt dubbele verzoeken.
Auth: Geen
Request body: { "email": "user@example.nl" }
POST /auth/reset-password
Wachtwoord resetten met token uit de reset-mail.
Auth: Geen
Request body:
| Veld | Type | Verplicht |
|---|---|---|
email | string | Ja |
token | string | Ja |
password | string (min 8) | Ja |
Na succes wordt een bevestigingsmail verstuurd en worden alle openstaande reset-tokens verwijderd.
Fouten: 400 — Ongeldige of verlopen token
POST /auth/change-password
Wachtwoord wijzigen voor ingelogde gebruiker. Vereist het huidige wachtwoord en verstuurt een bevestigingsmail.
Auth: Verplicht (elke rol)
Request body:
| Veld | Type | Verplicht |
|---|---|---|
email | string | Ja |
currentPassword | string | Ja |
newPassword | string (min 8) | Ja |
confirmPassword | string (min 8) | Ja |
Fouten: 400 — Wachtwoorden komen niet overeen; 401 — Huidig wachtwoord onjuist
GET /auth/users
Alle gebruikers ophalen (admin only).
Auth: Admin
Response: Array van { id, name, email, role } objecten.
POST /auth/device
Push notification device token registreren. Als het token al bestaat voor een andere gebruiker, wordt het opnieuw toegewezen.
Auth: Verplicht
Request body:
| Veld | Type | Verplicht |
|---|---|---|
token | string (max 512) | Ja |
platform | ios / android / web | Ja |
DELETE /auth/device
Device token verwijderen.
Auth: Verplicht
Request body: { "token": "device-token" }
GET /auth/setup-status
Controleer of de initiële setup nodig is. Retourneert needsSetup: true als er geen gebruikers bestaan.
Auth: Geen
Response:
{ "needsSetup": true }
POST /auth/setup
Initiële setup endpoint. Werkt alleen als er geen gebruikersaccounts bestaan.
Auth: Geen
Request body:
| Veld | Type | Verplicht | Beschrijving |
|---|---|---|---|
admin_name | string | Ja | Naam van de admin |
admin_email | string | Ja | E-mail van de admin |
admin_password | string (min 8) | Ja | Wachtwoord |
salon_name | string | Ja | Naam van de salon |
salon_email | string | Nee | Contactmail van de salon |
salon_phone | string | Nee | Telefoonnummer |
salon_address | string | Nee | Adres |
opening_hours | array | Nee | Array van { day_of_week, open_time, close_time, is_closed } |
Response (201):
{
"token": "jwt-access-token",
"user": { "id": 1, "name": "Admin", "role": "admin" }
}
Fouten: 400 — Setup al voltooid (gebruikers bestaan al)
De setup wizard in de webapplicatie roept dit endpoint aan. Zodra de setup voltooid is, worden verdere aanroepen geweigerd.