# Authentification Bearer Tokens ## Configuration L'API utilise **Laravel Sanctum** en mode **API tokens (Bearer)** uniquement. Le mode stateful (cookies) n'est pas utilisé. ## Endpoints ### POST /api/auth/login Connexion d'un utilisateur. Retourne un token Bearer et les informations de l'utilisateur. **Requête :** ```json { "email": "user@example.com", "password": "password123" } ``` **Réponse (200) :** ```json { "token": "1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "user": { "id": 1, "name": "John Doe", "email": "user@example.com", "roles": [...] } } ``` ### POST /api/auth/logout Déconnexion. Révoque le token courant. **Headers requis :** ``` Authorization: Bearer {token} ``` **Réponse (200) :** ```json { "message": "Déconnexion réussie" } ``` ### GET /api/auth/me Récupère les informations de l'utilisateur connecté. **Headers requis :** ``` Authorization: Bearer {token} ``` **Réponse (200) :** ```json { "user": { "id": 1, "name": "John Doe", "email": "user@example.com", "roles": [...], "permissions": [...] } } ``` ## Utilisation ### Avec curl ```bash # Connexion TOKEN=$(curl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"password123"}' \ | jq -r '.token') # Requête authentifiée curl -X GET http://localhost:8000/api/auth/me \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" ``` ### Avec JavaScript (fetch) ```javascript // Connexion const loginResponse = await fetch('http://localhost:8000/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: 'user@example.com', password: 'password123' }) }); const { token, user } = await loginResponse.json(); // Requête authentifiée const meResponse = await fetch('http://localhost:8000/api/auth/me', { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); const { user: currentUser } = await meResponse.json(); ``` ### Avec Axios ```javascript import axios from 'axios'; // Connexion const loginResponse = await axios.post('http://localhost:8000/api/auth/login', { email: 'user@example.com', password: 'password123' }); const { token, user } = loginResponse.data; // Configurer l'instance Axios avec le token const api = axios.create({ baseURL: 'http://localhost:8000/api', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); // Requête authentifiée const meResponse = await api.get('/auth/me'); const { user: currentUser } = meResponse.data; ``` ## Configuration ### Fichiers modifiés pour le mode Bearer tokens 1. **`bootstrap/app.php`** : Retrait du middleware `EnsureFrontendRequestsAreStateful` 2. **`config/sanctum.php`** : Simplifié pour le mode API tokens uniquement 3. **`config/cors.php`** : Retrait de `sanctum/csrf-cookie` des paths, `supports_credentials` mis à `false` 4. **`.env.example`** : Retrait de `SANCTUM_STATEFUL_DOMAINS` ### Routes protégées Toutes les routes protégées utilisent le middleware `auth:sanctum` : ```php Route::middleware('auth:sanctum')->group(function () { Route::post('/logout', [AuthController::class, 'logout']); Route::get('/me', [AuthController::class, 'me']); }); ``` ## Tests Les tests Feature sont disponibles dans `tests/Feature/AuthTest.php` : - `test_user_can_login_with_valid_credentials()` - Test de connexion réussie - `test_user_cannot_login_with_invalid_credentials()` - Test avec identifiants invalides - `test_authenticated_user_can_get_their_info()` - Test de récupération des infos utilisateur - `test_authenticated_user_can_logout()` - Test de déconnexion - `test_protected_routes_require_authentication()` - Test que les routes protégées nécessitent un token Pour exécuter les tests : ```bash php artisan test # ou php artisan test --filter AuthTest ```