Authentifizierung
Base path: /api/auth
POST /auth/login
Mit E-Mail und Passwort anmelden.
Auth: Keine
Request body:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
email | string | Ja | E-Mail-Adresse |
password | string | Ja | Passwort |
mobile | boolean | Nein | Bei true wird ein 30-Tage-Refresh-Token zurückgegeben |
Response (200):
{
"token": "jwt-access-token",
"refresh_token": "nur-bei-mobile-true",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Access Tokens laufen nach 8 Stunden ab. Bei mobile: true wird auch ein Refresh Token (30 Tage gültig) zurückgegeben.
Fehler: 401 — Ungültige Anmeldedaten
POST /auth/logout
Abmelden und Refresh-/Device-Token widerrufen.
Auth: Erforderlich (jede Rolle)
Request body:
| Feld | Typ | Beschreibung |
|---|---|---|
refresh_token | string | Zu widerrufendes Refresh Token |
device_token | string | Zu entfernendes Push-Device-Token |
POST /auth/refresh
Access Token über Refresh Token erneuern. Das alte Token wird gelöscht und ein neues ausgestellt (Token-Rotation).
Auth: Keine
Request body:
| Feld | Typ | Pflicht |
|---|---|---|
refresh_token | string | Ja |
Response (200):
{
"token": "neues-access-token",
"refresh_token": "neues-refresh-token",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Fehler: 401 — Ungültiges oder abgelaufenes Refresh Token
POST /auth/register
Neuen Benutzer anlegen (nur Admin). Sendet eine Willkommens-E-Mail mit einem temporären Passwort. Der neue Benutzer hat require_password_change: true.
Auth: Admin
Request body:
| Feld | Typ | Pflicht | Standard |
|---|---|---|---|
email | string | Ja | — |
name | string | Ja | — |
role | string | Nein | staff |
Response (200): { id, email, role, name }
Fehler: 409 — E-Mail-Adresse bereits registriert
POST /auth/forgot-password
Passwort-Reset-E-Mail senden. Gibt immer 200 zurück (verhindert E-Mail-Enumeration). Reset-Links laufen nach 1 Stunde ab.
Auth: Keine
Request body: { "email": "user@example.com" }
POST /auth/reset-password
Passwort mit Token aus der Reset-E-Mail zurücksetzen.
Auth: Keine
Request body:
| Feld | Typ | Pflicht |
|---|---|---|
email | string | Ja |
token | string | Ja |
password | string (min 8) | Ja |
Fehler: 400 — Ungültiges oder abgelaufenes Token
POST /auth/change-password
Passwort für eingeloggten Benutzer ändern.
Auth: Erforderlich (jede Rolle)
Request body:
| Feld | Typ | Pflicht |
|---|---|---|
email | string | Ja |
currentPassword | string | Ja |
newPassword | string (min 8) | Ja |
confirmPassword | string (min 8) | Ja |
Fehler: 400 — Passwörter stimmen nicht überein; 401 — Aktuelles Passwort falsch
GET /auth/users
Alle Benutzer abrufen (nur Admin).
Auth: Admin
Response: Array von { id, name, email, role } Objekten.
POST /auth/device
Push-Notification-Device-Token registrieren.
Auth: Erforderlich
Request body:
| Feld | Typ | Pflicht |
|---|---|---|
token | string (max 512) | Ja |
platform | ios / android / web | Ja |
DELETE /auth/device
Device Token entfernen.
Auth: Erforderlich
Request body: { "token": "device-token" }
GET /auth/setup-status
Prüfen ob die Ersteinrichtung erforderlich ist.
Auth: Keine
Response:
{ "needsSetup": true }
POST /auth/setup
Ersteinrichtungs-Endpoint. Funktioniert nur wenn keine Benutzer existieren.
Auth: Keine
Request body:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
admin_name | string | Ja | Admin-Name |
admin_email | string | Ja | Admin-E-Mail |
admin_password | string (min 8) | Ja | Passwort |
salon_name | string | Ja | Salonname |
salon_email | string | Nein | Kontakt-E-Mail |
salon_phone | string | Nein | Telefonnummer |
salon_address | string | Nein | Adresse |
opening_hours | array | Nein | Array von { day_of_week, open_time, close_time, is_closed } |
Response (201):
{
"token": "jwt-access-token",
"user": { "id": 1, "name": "Admin", "role": "admin" }
}
Fehler: 400 — Einrichtung bereits abgeschlossen