Ga naar hoofdinhoud

Authenticatie

Base path: /api/auth

POST /auth/login

Inloggen met e-mail en wachtwoord.

Auth: Geen

Request body:

VeldTypeVerplichtBeschrijving
emailstringJaE-mailadres
passwordstringJaWachtwoord
mobilebooleanNeeAls 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:

VeldTypeBeschrijving
refresh_tokenstringRefresh token om in te trekken
device_tokenstringPush 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:

VeldTypeVerplicht
refresh_tokenstringJa

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:

VeldTypeVerplichtDefault
emailstringJa
namestringJa
rolestringNeestaff

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:

VeldTypeVerplicht
emailstringJa
tokenstringJa
passwordstring (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:

VeldTypeVerplicht
emailstringJa
currentPasswordstringJa
newPasswordstring (min 8)Ja
confirmPasswordstring (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:

VeldTypeVerplicht
tokenstring (max 512)Ja
platformios / android / webJa

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:

VeldTypeVerplichtBeschrijving
admin_namestringJaNaam van de admin
admin_emailstringJaE-mail van de admin
admin_passwordstring (min 8)JaWachtwoord
salon_namestringJaNaam van de salon
salon_emailstringNeeContactmail van de salon
salon_phonestringNeeTelefoonnummer
salon_addressstringNeeAdres
opening_hoursarrayNeeArray 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)

info

De setup wizard in de webapplicatie roept dit endpoint aan. Zodra de setup voltooid is, worden verdere aanroepen geweigerd.