# 🔐 SSO GP v3 → My Truck

Permet à un utilisateur connecté à **GP v3** (ton site PHP) d'arriver directement connecté sur **My Truck** sans repasser par le formulaire de login.

---

## 🎯 Comment ça marche

1. L'utilisateur est connecté sur GP v3 (table `users` partagée)
2. Il clique sur le bouton "My Truck" du dashboard GP v3
3. PHP **génère un JWT court** (90s max) signé HMAC-SHA256 avec une **clé partagée** `SSO_SECRET`
4. PHP **redirige** vers `https://mytruck.ton-domaine.com/sso?t=<JWT>`
5. My Truck **valide** le JWT, ouvre une session normale (JWT 1 an) et redirige vers le dashboard

Si le user doit changer son code à 6 chiffres (1ère connexion) → il est dirigé vers la page de changement.

---

## ⚙️ Étape 1 — Configurer le secret partagé

Choisis une clé secrète aléatoire de 32+ caractères (différente du `JWT_SECRET` de My Truck c'est mieux).

```bash
openssl rand -hex 32
# Exemple: 9f2c8a1b4e6d3f7a0c2e5b8d1a4f7c0e3b6a9d2c5f8e1b4a7d0c3f6e9b2a5d8c
```

### 1a) Côté My Truck — Portainer
Dans ta stack `cariste-api`, ajoute la variable d'env sur le service `cariste-backend` :

```yaml
environment:
  ...
  SSO_SECRET: "9f2c8a1b4e6d3f7a0c2e5b8d1a4f7c0e3b6a9d2c5f8e1b4a7d0c3f6e9b2a5d8c"
```

Puis **Update the stack**.

### 1b) Côté GP v3 — config.php
Dans ton fichier de config PHP (par ex. `/GPv3/config.php` ou `.env`), ajoute :

```php
define('MYTRUCK_SSO_SECRET', '9f2c8a1b4e6d3f7a0c2e5b8d1a4f7c0e3b6a9d2c5f8e1b4a7d0c3f6e9b2a5d8c');
define('MYTRUCK_URL', 'https://appli.gp-eff.fr');
```

⚠️ **La même chaîne** doit être configurée côté Portainer ET côté PHP.

---

## 🧩 Étape 2 — Le PHP qui génère le lien SSO

Crée le fichier `/GPv3/mytruck_sso.php` (ou n'importe quel nom) :

```php
<?php
// /GPv3/mytruck_sso.php
// Génère un lien SSO court (90s) et redirige vers My Truck.
// Utilise UNIQUEMENT si l'utilisateur est déjà authentifié sur GP v3.

require_once __DIR__ . '/config.php';   // doit définir MYTRUCK_SSO_SECRET et MYTRUCK_URL
session_start();

// Vérifie que l'utilisateur est connecté sur GP v3
// (adapte selon ton système d'auth - ici on suppose que tu stockes l'id en session)
if (empty($_SESSION['user_id'])) {
    header('Location: /GPv3/login.php');
    exit;
}

$userId = (int) $_SESSION['user_id'];

// Construire le JWT HS256 (sans aucune lib externe)
function b64url($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

$header  = ['alg' => 'HS256', 'typ' => 'JWT'];
$payload = [
    'sso' => true,
    'uid' => $userId,
    'iat' => time(),
    'exp' => time() + 60, // 60s de validité, large marge avant SSO_MAX_AGE de 90s
];

$h = b64url(json_encode($header));
$p = b64url(json_encode($payload));
$sig = b64url(hash_hmac('sha256', "$h.$p", MYTRUCK_SSO_SECRET, true));
$jwt = "$h.$p.$sig";

// Rediriger vers My Truck
$url = rtrim(MYTRUCK_URL, '/') . '/sso?t=' . urlencode($jwt);
header('Location: ' . $url);
exit;
```

---

## 🔘 Étape 3 — Le bouton "My Truck" dans GP v3

Sur ton dashboard, remplace le bouton actuel par un lien vers `/GPv3/mytruck_sso.php` :

```html
<a href="/GPv3/mytruck_sso.php"
   class="card">
   <h3>My Truck</h3>
   <p>Dossiers camions et suivi des signalements.</p>
</a>
```

Ou si tu veux ouvrir dans un nouvel onglet :

```html
<a href="/GPv3/mytruck_sso.php" target="_blank" rel="noopener">My Truck</a>
```

---

## 🧪 Test rapide

1. Connecte-toi à GP v3 avec ton compte (`mathieu.u`)
2. Clique sur "My Truck"
3. Tu dois arriver sur le dashboard My Truck **sans aucun formulaire**
4. Si c'est ta première connexion à My Truck → page "Choisis ton nouveau code à 6 chiffres" automatiquement

---

## 🛡️ Sécurité

- ✅ **Lien à usage court** : valide seulement 60s côté payload + 90s max côté My Truck
- ✅ **Signature HMAC SHA256** : impossible de falsifier sans connaître `SSO_SECRET`
- ✅ **Rôle filtré** : My Truck refuse les comptes `admin` (réservés à ton site web)
- ✅ **Compte désactivé** : `is_active=0` est refusé
- ⚠️ **`SSO_SECRET` ne doit JAMAIS être commit dans Git ni partagé** (uniquement Portainer + serveur PHP)
- ⚠️ Si tu suspectes une fuite de la clé : régénère-la dans Portainer + PHP, restart le backend My Truck

---

## 🐛 Erreurs courantes

| Message | Cause | Solution |
|---------|-------|----------|
| `Lien SSO expiré` | L'utilisateur a mis +90s entre le clic et l'arrivée | Re-clique sur le bouton |
| `Token SSO invalide` | `SSO_SECRET` différent entre PHP et Portainer | Vérifie la valeur des 2 côtés |
| `Ce compte n'a pas accès à My Truck` | Le user a role `admin` | Change-le en `cariste` ou `bureau` dans phpMyAdmin |
| `Utilisateur introuvable` | L'id session PHP ne correspond pas à un user en DB | Vérifie ton système d'auth PHP |
| Page blanche après redirection | URL `MYTRUCK_URL` mal configurée | Mets l'URL EXACTE accessible depuis le navigateur du user |

---

## 💡 Flow utilisateur final

```
[GP v3]                              [My Truck]
   |                                     |
   | 1. Login mathieu.u (PHP session)    |
   | 2. Clique sur "My Truck"            |
   |                                     |
   |  3. PHP signe JWT (60s) ----------->|
   |     302 → /sso?t=<jwt>              |
   |                                     |
   |              4. /api/auth/sso valide|
   |              5. Émet JWT 1 an       |
   |              6. localStorage        |
   |                                     |
   |                7. → /dashboard      |
   |                   (ou /change-pwd)  |
```

Total : ~1 seconde, zéro clic, zéro mot de passe à retaper. 🚀
