====== Flow Authorization Code ======
===== Objectif =====
Le flow **Authorization Code** est le mode d’intégration principal de L’Identité Numérique La Poste.
Il permet :
* d’authentifier un utilisateur
* de récupérer ses données d’identité
* de garantir un haut niveau de sécurité
-----
===== Principe =====
Le flow repose sur un échange en plusieurs étapes :
- Redirection utilisateur vers LINLP
- Authentification (mobile)
- Retour avec un code temporaire
- Échange du code contre des tokens
- Récupération des données utilisateur
👉 Ce flow est conforme au standard OpenID Connect.
-----
===== Étape 1 : appel /authorize =====
Le partenaire redirige l’utilisateur vers LINLP.
GET /authorize
Paramètres principaux :
* client_id
* redirect_uri
* response_type=code
* scope
* state (recommandé)
* nonce (recommandé)
* login_hint (optionnel)
Exemple :
https://authent.pprod.lidentitenumerique.laposte.fr/auth/realms/partenaire/protocol/openid-connect/auth
?client_id=XXX
&response_type=code
&redirect_uri=https://monservice.fr/callback
&scope=openid+profile+email
&state=abc123
&nonce=xyz456
💡 `login_hint` permet de pré-remplir le téléphone utilisateur.
-----
===== Étape 2 : authentification utilisateur =====
L’utilisateur :
* est redirigé vers LINLP
* reçoit une notification sur son mobile
* valide via son code secret
👉 Le consentement des données est demandé si nécessaire.
-----
===== Étape 3 : redirection avec code =====
Après succès :
https://monservice.fr/callback?code=ABC123&state=abc123
⚠️ Le code :
* est temporaire (durée courte)
* est à usage unique
-----
===== Étape 4 : échange du code (/token) =====
Le backend appelle :
POST /token
Exemple :
grant_type=authorization_code
code=ABC123
redirect_uri=https://monservice.fr/callback
👉 Authentification requise via :
* client_id
* client_secret
-----
===== Étape 5 : récupération des tokens =====
Réponse :
* access_token
* id_token (JWT signé)
* expires_in
-----
===== Étape 6 : récupération des données (/userinfo) =====
GET /userinfo
Authorization: Bearer access_token
👉 Retour :
* données utilisateur (claims)
* informations de contexte
-----
===== 🔐 Recommandation critique =====
⚠️ Le partenaire doit impérativement **stocker le id_token**
👉 Pourquoi ?
* il constitue la **preuve d’authentification de l’utilisateur**
* il est **signé par LINLP**
* il peut être **vérifié cryptographiquement à tout moment**
* il ne dépend pas de la disponibilité de LINLP
👉 Cas d’usage :
* audit de connexion
* preuve légale
* contrôle a posteriori
* gestion de litiges
💡 Contrairement à l’access_token, le **id_token doit être conservé côté partenaire**
-----
===== Cas d’erreur =====
===== Erreurs côté /authorize =====
^ Cas ^ Comportement ^
| Scope invalide | Redirection avec error=invalid_scope |
| client_id incorrect | Erreur 400 |
| redirect_uri incorrect | Erreur 400 |
-----
===== Erreurs côté utilisateur =====
^ Cas ^ Comportement ^
| Refus utilisateur | Retour page login |
| Timeout validation | Retour page login |
| Utilisateur inconnu | Timeout |
-----
===== Erreurs côté /token =====
^ Cas ^ Description ^
| Code invalide | invalid_grant |
| Code expiré | invalid_grant |
| Mauvais client_secret | unauthorized_client |
-----
===== Erreurs côté /userinfo =====
^ Cas ^ Description ^
| Token invalide | invalid_token |
| Token expiré | accès refusé |
-----
===== Bonnes pratiques =====
⚠️ Toujours utiliser un backend
* Ne jamais appeler `/token` depuis le frontend.
⚠️ Vérifier le paramètre state
* Permet d’éviter les attaques CSRF.
⚠️ Vérifier le nonce
* Permet d’éviter les attaques de rejeu.
⚠️ Vérifier la signature du id_token
* Garantit l’intégrité des données.
⚠️ Gérer les expirations
* Les codes et tokens expirent rapidement.
⚠️ Journaliser les erreurs
* Indispensable pour le support et debug.
-----
===== Points d’attention =====
⚠️ redirect_uri doit être strictement identique
* Sinon rejet automatique.
⚠️ Les scopes doivent être déclarés en amont
* Impossible d’en ajouter dynamiquement.
⚠️ Le flow est synchrone côté utilisateur
* Prévoir une UX adaptée (chargement, attente).
⚠️ Les données retournées dépendent :
* des scopes demandés
* du paramétrage LINLP
* du consentement utilisateur
-----
===== Résumé =====
* Flow standard OpenID Connect
* Basé sur redirection + échange sécurisé
* Retour de tokens dont le **id_token clé**
* Recommandé pour tous les cas d’usage web et mobile
-----
===== Étape suivante =====
👉 Pour des cas avancés :
[[integration:flow_ciba|Flow CIBA]]