====== JWT et userinfo ====== ===== Objectif ===== Lors d’une authentification via LINLP, plusieurs éléments sont retournés : * un **id_token** (JWT) * un **access_token** * un endpoint **/userinfo** 👉 Cette page explique leur rôle et leur utilisation. ----- ===== Vue d’ensemble ===== ^ Élément ^ Rôle ^ | id_token | Contient les données d’identité (JWT signé) | | access_token | Permet d’appeler les APIs | | /userinfo | Permet de récupérer les données utilisateur | ----- ===== ⚠️ Recommandation clé : conservation du id_token ===== ⚠️ **Le id_token doit être conservé par le partenaire.** 👉 Il constitue : * la **preuve d’authentification** de l’utilisateur * une preuve **horodatée et signée** * un élément **vérifiable a posteriori** 👉 En effet : * le id_token est **signé par LINLP** * il peut être **vérifié à tout moment** * il ne dépend pas d’un appel API 💡 Cela permet : * audit de sécurité * traçabilité des connexions * preuve en cas de litige ----- ===== ID Token (JWT) ===== Le **id_token** est un JSON Web Token signé contenant : * les données utilisateur (claims) * des informations de session * une signature garantissant l’intégrité ----- ===== Structure d’un JWT ===== Un JWT est composé de 3 parties : HEADER.PAYLOAD.SIGNATURE ----- ===== Exemple de JWT (décodé) ===== ===== Header ===== { "alg": "RS256", "typ": "JWT", "kid": "abc123" } ----- ===== Payload ===== { "sub": "075ccece-6699-4c08-80ca-27a6af136b68", "given_name": "Jean Pierre", "family_name": "Dupont", "preferred_username": "Martin", "birthdate": "1990-05-10", "email": "jean.dupont@mail.com", "iat": 1710000000, "exp": 1710003600, "iss": "https://authent.lidentitenumerique.laposte.fr", "aud": "client_id" } ----- ===== Points importants ===== ⚠️ Le payload est lisible Un JWT n’est **pas chiffré**, seulement signé. ⚠️ Ne jamais faire confiance sans vérification Toujours vérifier la signature. ----- ===== Vérification du JWT ===== Le partenaire doit : * récupérer la clé publique LINLP (JWKS) * vérifier la signature * vérifier les champs : * `exp` (expiration) * `iss` (issuer) * `aud` (client_id) ----- ===== Access Token ===== Le **access_token** : * permet d’appeler `/userinfo` * représente l’autorisation d’accès 👉 Il ne doit pas être utilisé directement pour lire les données. ----- ===== Endpoint /userinfo ===== Permet de récupérer les données utilisateur via API : GET /userinfo Authorization: Bearer access_token ----- ===== Exemple de réponse ===== { "sub": "075ccece-6699-4c08-80ca-27a6af136b68", "given_name": "Jean Pierre", "family_name": "Dupont", "email": "jean.dupont@mail.com" } ----- ===== id_token vs userinfo ===== ^ Critère ^ id_token ^ /userinfo ^ | Format | JWT | JSON | | Signature | Oui | Non | | Utilisation | Authentification | Données utilisateur | ----- ===== Bonnes pratiques ===== ⚠️ Conserver le id_token Il constitue une preuve d’authentification vérifiable. ⚠️ Toujours vérifier le JWT Signature + expiration obligatoires. ⚠️ Ne pas exposer les tokens Jamais côté frontend non sécurisé. ⚠️ Utiliser HTTPS uniquement Transport sécurisé obligatoire. ----- ===== Points d’attention ===== ⚠️ Le access_token est sensible À protéger comme un mot de passe. ----- ===== Résumé ===== * id_token = identité + preuve d’authentification * access_token = accès aux APIs * /userinfo = récupération des données * Le id_token doit être conservé pour audit et preuve ----- ===== Étape suivante ===== 👉 Tester l’intégration : [[tests:creer_une_identite_de_test|Créer une identité de test]]