API REST
API REST stateless avec API Platform 4 et authentification JWT.
Vue d'ensemble
L'API REST est construite avec API Platform 4 et utilise des ressources DTO
(Data Transfer Objects) couplées à des State Providers/Processors sur mesure.
Toutes les routes sont protégées par un JWT Bearer token émis par
lexik/jwt-authentication-bundle.
La documentation interactive OpenAPI est disponible sur /api/docs
(accessible publiquement, même en prod).
| Fichier | Rôle |
|---|---|
src/ApiResource/MeResource.php | DTO — profil utilisateur courant |
src/ApiResource/OrganizationResource.php | DTO — organisations |
src/ApiResource/MemberResource.php | DTO — membres d'une organisation |
src/ApiResource/SubscriptionResource.php | DTO — abonnement d'une organisation |
src/State/Api/ | State Providers & Processors (logique multi-tenant) |
config/packages/api_platform.yaml | Config API Platform |
config/jwt/ | Clés RSA JWT (générées localement, non committées) |
Authentification JWT
Toutes les requêtes sur /api (hors
POST /api/auth/token et
/api/docs) requièrent un header
Authorization: Bearer <token>.
Obtenir un token
POST /api/auth/token
Content-Type: application/json
{
"email": "user@example.com",
"password": "your_password"
}
Réponse :
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
}
Utiliser le token
GET /api/me
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...
Génération des clés (première fois)
php bin/console lexik:jwt:generate-keypair
Les clés RSA sont générées dans config/jwt/
et sont exclues du dépôt git via .gitignore.
La passphrase est configurée via la variable JWT_PASSPHRASE dans
.env.local.
Endpoints
| Méthode | URL | Description | Auth |
|---|---|---|---|
POST |
/api/auth/token |
Obtenir un JWT (email + password) | Public |
GET |
/api/me |
Profil de l'utilisateur courant | JWT |
PATCH |
/api/me |
Modifier firstName, lastName, preferredLocale | JWT |
GET |
/api/organizations |
Liste des organisations de l'utilisateur | JWT |
GET |
/api/organizations/{id} |
Détail d'une organisation (membre actif requis) | JWT |
GET |
/api/organizations/{id}/members |
Membres d'une organisation (membre actif requis) | JWT |
GET |
/api/organizations/{id}/subscription |
Abonnement actif d'une organisation | JWT |
Sécurité multi-tenant
Chaque State Provider vérifie manuellement que l'utilisateur JWT est un
membre actif (non suspendu) de l'organisation demandée. En cas d'accès non
autorisé, une réponse 404 Not Found
est retournée pour éviter l'énumération des ressources.
Exemple dans OrganizationProvider :
$membership = $this->memberRepository->findActiveMembership($user, $organization);
if (null === $membership) {
throw new NotFoundHttpException(); // 404, pas 403
}
Étendre l'API
Pour ajouter un nouvel endpoint, créez un DTO dans
src/ApiResource/ avec l'attribut
#[ApiResource], puis un State Provider
dans src/State/Api/.
-
1
Créer le DTO dans
src/ApiResource/MyResource.php -
2
Ajouter un
ProviderInterfacedanssrc/State/Api/MyProvider.php -
3
Vérifier que l'utilisateur a accès aux données (logique multi-tenant)