# README - Portail d'Authentification

Ce document décrit l'architecture et les procédures pour gérer le portail d'authentification, notamment pour y ajouter de nouvelles applications.

## Introduction

Ce portail sert de point d'entrée unique et sécurisé pour un ensemble d'applications. Il gère l'authentification des utilisateurs, la sécurité des sessions et fournit un tableau de bord listant les applications auxquelles l'utilisateur a accès.

Le lancement d'une application se fait via un proxy de sécurité qui vérifie les permissions et transmet l'identité de l'utilisateur de manière sécurisée via un **JSON Web Token (JWT)**.

## Procédure pour Ajouter une Nouvelle Application

Pour ajouter une nouvelle application (par exemple, un "CRM Client") au portail, suivez ces trois étapes.

### Étape 1 : Déployer les fichiers de l'application

1.  **Créez un dossier pour votre application** à l'intérieur du répertoire `apps/` situé à la racine du projet. Le nom de ce dossier doit être simple, sans espaces (utilisez des tirets ou underscores).
    *   *Exemple :* Créez le dossier `crm-client`.
    *   Chemin complet : `C:/xampp/htdocs/Authentification/apps/crm-client/`

2.  **Placez les fichiers de votre application** dans ce nouveau dossier. Le point d'entrée de l'application doit être un fichier `index.html` ou `index.php`.
    *   *Exemple :* `C:/xampp/htdocs/Authentification/apps/crm-client/index.html`

### Étape 2 : Enregistrer l'application dans la base de données

Exécutez une requête SQL pour ajouter les informations de votre application dans la table `auth_applications`.

*   **`name`** : Le nom qui sera affiché sur la carte (ex: "CRM Client").
*   **`description`** : Une courte phrase décrivant l'application.
*   **`url`** : Le nom exact du dossier que vous avez créé à l'étape 1 (ex: `crm-client`). **C'est le champ le plus important.**
*   **`icon`** : (Optionnel) Une classe d'icône FontAwesome pour l'affichage (ex: `fas fa-users`).

**Exemple de requête SQL :**
```sql
INSERT INTO auth_applications (name, description, url, icon)
VALUES ('CRM Client', 'Gestion des fiches et interactions clients.', 'crm-client', 'fas fa-users');
```
> **Note :** Après cette insertion, notez l'**ID** de la nouvelle application (par exemple, si c'est la 3ème application, son ID sera `3`). Vous en aurez besoin pour la prochaine étape.

### Étape 3 : Donner les permissions aux utilisateurs

Maintenant, vous devez spécifier quels utilisateurs ont le droit de voir et de lancer cette nouvelle application. Pour cela, insérez une ligne dans la table `auth_user_app_permissions`.

*   **`user_id`** : L'ID de l'utilisateur à qui vous donnez l'accès.
*   **`app_id`** : L'ID de l'application que vous venez de créer à l'étape 2.

**Exemple de requête SQL (pour donner l'accès à l'utilisateur avec l'ID `4` à notre nouvelle application avec l'ID `3`) :**
```sql
INSERT INTO auth_user_app_permissions (user_id, app_id)
VALUES (4, 3);
```

---

C'est tout ! Une fois ces trois étapes terminées, l'utilisateur concerné verra la nouvelle carte "CRM Client" sur son tableau de bord et pourra la lancer.

## Sécurité et Validation du JWT (Côté Application Tierce)

Lorsque le portail lance une application, il la redirige avec un JWT dans l'URL (paramètre `?token=...`). Il est de la **responsabilité de l'application tierce** de valider ce token pour sécuriser son accès.

Voici un exemple simple en PHP pour une application tierce qui voudrait valider le token :

```php
<?php 
    // Dans le fichier index.php de l'application (ex: /apps/crm-client/index.php) 
    require_once '../../vendor/autoload.php'; 
    // Accéder au vendor du portail use Firebase\JWT\JWT; 
    use Firebase\JWT\Key; 
    $token = $_GET['token'] ?? null; 
    $secretKey = 'VOTRE_APP_SECRET_DU_FICHIER_.ENV'; 
    // Important : la clé doit être la même que celle du portail 
    if (!$token) { 
        die("Accès non autorisé : token manquant.");
    } 
    try { 
        $decoded = JWT::decode($token, new Key($secretKey, 'HS256')); 
        // Le token est valide ! 
        $userId = $decoded->uid; 
        echo "<h1>Bienvenue dans le CRM, utilisateur #{$userId}</h1>"; 
        // Ici, vous pouvez démarrer la session de votre application CRM. 
    } catch (Exception $e) { 
        // Le token est invalide (expiré, mauvaise signature, etc.) 
        http_response_code(401); 
        die("Accès refusé : " . $e->getMessage()); 
    } 
?>
```
