Authentification
Base path: /api/auth
POST /auth/login
Se connecter avec email et mot de passe.
Auth: Aucune
Request body:
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
email | string | Oui | Adresse email |
password | string | Oui | Mot de passe |
mobile | boolean | Non | Si true, un refresh token de 30 jours est retourné |
Response (200):
{
"token": "jwt-access-token",
"refresh_token": "seulement-si-mobile-true",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Les access tokens expirent après 8 heures. Avec mobile: true, un refresh token (valable 30 jours) est également retourné.
Erreurs: 401 — Identifiants invalides
POST /auth/logout
Se déconnecter et révoquer le refresh/device token.
Auth: Requise (tout rôle)
Request body:
| Champ | Type | Description |
|---|---|---|
refresh_token | string | Refresh token à révoquer |
device_token | string | Device token push à supprimer |
POST /auth/refresh
Renouveler l'access token via le refresh token. L'ancien token est supprimé et un nouveau est émis (rotation de tokens).
Auth: Aucune
Request body:
| Champ | Type | Obligatoire |
|---|---|---|
refresh_token | string | Oui |
Response (200):
{
"token": "nouveau-access-token",
"refresh_token": "nouveau-refresh-token",
"user": {
"id": 1,
"name": "Admin",
"email": "admin@salon.nl",
"role": "admin",
"require_password_change": false
}
}
Erreurs: 401 — Refresh token invalide ou expiré
POST /auth/register
Créer un nouvel utilisateur (admin uniquement). Envoie un email de bienvenue avec un mot de passe temporaire. Le nouvel utilisateur aura require_password_change: true.
Auth: Admin
Request body:
| Champ | Type | Obligatoire | Défaut |
|---|---|---|---|
email | string | Oui | — |
name | string | Oui | — |
role | string | Non | staff |
Response (200): { id, email, role, name }
Erreurs: 409 — Email déjà enregistré
POST /auth/forgot-password
Envoyer un email de réinitialisation de mot de passe. Retourne toujours 200 (évite l'énumération d'emails). Les liens expirent après 1 heure.
Auth: Aucune
Request body: { "email": "user@example.com" }
POST /auth/reset-password
Réinitialiser le mot de passe avec le token de l'email de réinitialisation.
Auth: Aucune
Request body:
| Champ | Type | Obligatoire |
|---|---|---|
email | string | Oui |
token | string | Oui |
password | string (min 8) | Oui |
Erreurs: 400 — Token invalide ou expiré
POST /auth/change-password
Modifier le mot de passe pour un utilisateur connecté.
Auth: Requise (tout rôle)
Request body:
| Champ | Type | Obligatoire |
|---|---|---|
email | string | Oui |
currentPassword | string | Oui |
newPassword | string (min 8) | Oui |
confirmPassword | string (min 8) | Oui |
Erreurs: 400 — Les mots de passe ne correspondent pas; 401 — Mot de passe actuel incorrect
GET /auth/users
Obtenir tous les utilisateurs (admin uniquement).
Auth: Admin
Response: Tableau d'objets { id, name, email, role }.
POST /auth/device
Enregistrer un device token pour les notifications push.
Auth: Requise
Request body:
| Champ | Type | Obligatoire |
|---|---|---|
token | string (max 512) | Oui |
platform | ios / android / web | Oui |
DELETE /auth/device
Supprimer un device token.
Auth: Requise
Request body: { "token": "device-token" }
GET /auth/setup-status
Vérifier si la configuration initiale est nécessaire.
Auth: Aucune
Response:
{ "needsSetup": true }
POST /auth/setup
Endpoint de configuration initiale. Fonctionne uniquement quand aucun compte utilisateur n'existe.
Auth: Aucune
Request body:
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
admin_name | string | Oui | Nom de l'admin |
admin_email | string | Oui | Email de l'admin |
admin_password | string (min 8) | Oui | Mot de passe |
salon_name | string | Oui | Nom du salon |
salon_email | string | Non | Email de contact |
salon_phone | string | Non | Téléphone |
salon_address | string | Non | Adresse |
opening_hours | array | Non | Tableau de { day_of_week, open_time, close_time, is_closed } |
Response (201):
{
"token": "jwt-access-token",
"user": { "id": 1, "name": "Admin", "role": "admin" }
}
Erreurs: 400 — Configuration déjà terminée