# Note d'intégration : LoginLibrary

Cette note explique comment intégrer la bibliothèque `LoginLibrary` dans un nouveau projet (ex: application Laravel).

## 1. Ajout de la dépendance

Dans le fichier `composer.json` de votre projet cible, ajoutez le chemin local vers la bibliothèque dans la section `repositories` :

```json
"repositories": [
    {
        "type": "path",
        "url": "c:/wamp64/www/LoginLibrary"
    }
],
```

Ensuite, installez le package avec Composer en ligne de commande :

```bash
composer require grimaud/login-iam-library:@dev
```

## 2. Configuration Keycloak

Créez un fichier de configuration `config/keycloak.php` dans votre projet pour définir les paramètres de connexion au serveur Keycloak :

```php
<?php

return [
    'issuer'                 => env('KEYCLOAK_ISSUER', 'https://keycloak.mairie-grimaud.fr/realms/VotreRealm'),
    'client_id'              => env('KEYCLOAK_CLIENT_ID', 'votre_client_id'),
    'client_secret'          => env('KEYCLOAK_CLIENT_SECRET', ''), // Facultatif si c'est un client public
    'authorization_endpoint' => env('KEYCLOAK_AUTH_ENDPOINT', 'https://keycloak.mairie-grimaud.fr/.../auth'),
    'end_session_endpoint'   => env('KEYCLOAK_LOGOUT_ENDPOINT', 'https://keycloak.mairie-grimaud.fr/.../logout'),
    'scope'                  => env('KEYCLOAK_SCOPE', 'openid profile email'),
    'verify'                 => env('KEYCLOAK_VERIFY_SSL', true), // false en dev local sans HTTPS
];
```

Pensez à bien déclarer ces variables dans votre fichier `.env`.

## 3. Mise en place de l'authentification (Contrôleur)

Vous devrez implémenter un contrôleur (par ex: `AuthController`) avec les trois étapes clés du flux OIDC :

### A. Connexion (Login)
1. Instanciez `Grimaud\LoginIamLibrary\AuthService`.
2. Générez des paramètres aléatoires PKCE (`state` et `code_verifier`).
3. Sauvegardez-les en session Laravel (`session(['oauth_state' => $state, 'oauth_code_verifier' => $codeVerifier])`).
4. Redirigez l'utilisateur vers l'URL fournie par `$authService->getAuthorizationUrl()`.

### B. Traitement du retour (Callback)
1. Vérifiez que le `state` reçu dans la requête correspond à celui en session (protection CSRF).
2. Échangez le code d'autorisation contre des jetons via `$authService->exchangeCodeForTokens()`.
3. Sauvegardez au minimum l'`access_token` et l'`id_token` en session.
4. Identifiez l'utilisateur avec `$authService->authenticateAndAuthorize($accessToken)->getTokenInfo()` si vous souhaitez le lier à un modèle `User` local.

### C. Déconnexion (Logout)
1. Récupérez l'`id_token` stocké en session.
2. Videz la session Laravel (`session()->flush()`).
3. Redirigez l'utilisateur vers l'URL de déconnexion globale générée par `$authService->getLogoutUrl()`.

## 4. Gestion des autorisations dans votre code

Pour protéger vos routes ou conditionner l'affichage selon les droits de l'utilisateur, utilisez l'`access_token` stocké en session :

```php
use Grimaud\LoginIamLibrary\AuthService;
use Grimaud\LoginIamLibrary\Exceptions\TokenException;

try {
    $authService = new AuthService(config('keycloak'));
    $checker = $authService->authenticateAndAuthorize(session('access_token'));

    // 1. Informations de l'utilisateur
    $email = $checker->getTokenInfo()->getEmail();

    // 2. Vérifier l'appartenance à un groupe Keycloak
    if ($checker->isInGroup('/Direction')) {
        // L'utilisateur est dans le groupe Direction
    }

    // 3. Vérifier la présence d'un rôle (client ou realm)
    if ($checker->hasRole('admin')) {
        // L'utilisateur possède le rôle admin
    }

} catch (TokenException $e) {
    // Le token est invalide, expiré, ou la session a été interrompue.
    // -> Rediriger vers la page de login ou renvoyer une erreur 401
}
```
