OpenID Connect · OAuth 2.0

Les flows en diagrammes

Qui parle à qui, dans quel ordre. Les traits pleins sont des requêtes, les pointillés des réponses. Pour choisir, commencez par Quel flow choisir ?

Authorization Code + PKCE · Hybride (code id_token, code token…) · Implicit (id_token, id_token token) · Refresh Token · Client Credentials · Mot de passe (ROPC) · Device Code (RFC 8628) · Échange de jeton (RFC 8693) · Déconnexion (RP-initiated et back-channel) · Introspection et révocation · private_key_jwt et JWT Bearer (RFC 7523) · PAR et JAR (RFC 9126 et 9101) · JARM (réponse d’autorisation signée) · DPoP (RFC 9449) · CIBA (Client-Initiated Backchannel)

Authorization Code + PKCE Recommandé

Le flow standard : le navigateur ne voit qu’un code à usage unique, les jetons passent de serveur à serveur.

NavigateurApplicationFournisseur (OP)API1. Génère code_verifier,state, nonce2. 302 vers /authorize(challenge, state, nonce)3. GET /authorize4. Page de connexion et de consentement5. Identifiants et accord de la personne6. 302 redirect_uri?code=…&state=…7. GET /callback?code=…&state=…8. POST /token (code,code_verifier, secret)9. ID token + access token (+refresh token)10. Vérifie signature, iss,aud, nonce11. Authorization: Bearer access_token12. Données demandées
Version texte du diagramme
  1. Application : Génère code_verifier, state, nonce
  2. Application → Navigateur : 302 vers /authorize (challenge, state, nonce)
  3. Navigateur → Fournisseur (OP) : GET /authorize
  4. Fournisseur (OP) → Navigateur : Page de connexion et de consentement
  5. Navigateur → Fournisseur (OP) : Identifiants et accord de la personne
  6. Fournisseur (OP) → Navigateur : 302 redirect_uri?code=…&state=…
  7. Navigateur → Application : GET /callback?code=…&state=…
  8. Application → Fournisseur (OP) : POST /token (code, code_verifier, secret)
  9. Fournisseur (OP) → Application : ID token + access token (+ refresh token)
  10. Application : Vérifie signature, iss, aud, nonce
  11. Application → API : Authorization: Bearer access_token
  12. API → Application : Données demandées

À utiliser quand : Tout site web, application mobile, SPA ou application de bureau où une personne se connecte.

Ce qui le distingue : C’est la base. Tous les autres flows en sont une variante ou un cas particulier.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Hybride (code id_token, code token…) Cas précis

On reçoit l’identité tout de suite dans le navigateur, et le code pour obtenir les jetons sûrement.

NavigateurApplicationFournisseur (OP)1. 302 vers /authorize(response_type=code id_token)2. GET /authorize puis connexion3. 302 redirect_uri#code=…&id_token=…&state=…4. Un script lit le fragmentet le renvoie5. POST /callback (code,id_token, state)6. Vérifie id_token et c_hash7. POST /token (code,code_verifier)8. access token (+ refreshtoken)
Version texte du diagramme
  1. Application → Navigateur : 302 vers /authorize (response_type=code id_token)
  2. Navigateur → Fournisseur (OP) : GET /authorize puis connexion
  3. Fournisseur (OP) → Navigateur : 302 redirect_uri#code=…&id_token=…&state=…
  4. Navigateur : Un script lit le fragment et le renvoie
  5. Navigateur → Application : POST /callback (code, id_token, state)
  6. Application : Vérifie id_token et c_hash
  7. Application → Fournisseur (OP) : POST /token (code, code_verifier)
  8. Fournisseur (OP) → Application : access token (+ refresh token)

À utiliser quand : Une application qui doit connaître la personne avant d’échanger le code (validation de session côté serveur, anciennes bibliothèques).

Ce qui le distingue : Comme le code, mais l’ID token arrive dès la redirection (avec c_hash qui le lie au code).

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Implicit (id_token, id_token token) Déconseillé

Les jetons arrivent directement dans l’adresse : plus simple, mais exposé.

Navigateur (SPA)Fournisseur (OP)API1. Génère state et nonce2. GET /authorize(response_type=id_token token)3. 302redirect_uri#id_token=…&access_token=…4. Lit le fragment, vérifie lejeton5. Authorization: Bearer access_token
Version texte du diagramme
  1. Navigateur (SPA) : Génère state et nonce
  2. Navigateur (SPA) → Fournisseur (OP) : GET /authorize (response_type=id_token token)
  3. Fournisseur (OP) → Navigateur (SPA) : 302 redirect_uri#id_token=…&access_token=…
  4. Navigateur (SPA) : Lit le fragment, vérifie le jeton
  5. Navigateur (SPA) → API : Authorization: Bearer access_token

À utiliser quand : Presque jamais. Seulement pour de vieilles SPA ou pour vérifier qu’une application l’interdit bien.

Ce qui le distingue : Aucun échange de code : pas de canal arrière, pas de refresh token, jetons visibles de l’historique du navigateur.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Refresh Token Complément

Renouveler un access token qui vit peu, sans redemander la personne.

ApplicationFournisseur (OP)API1. Authorization: Bearer access_token2. 401 invalid_token (expiré)3. POST /token(grant_type=refresh_token)4. Révoque l’ancien refreshtoken (rotation)5. Nouvel access token + nouveaurefresh token6. Authorization: Bearer nouvel access_tokenSi l’ancien refresh token estrejoué, toute la famille de jetonsest révoquée.
Version texte du diagramme
  1. Application → API : Authorization: Bearer access_token
  2. API → Application : 401 invalid_token (expiré)
  3. Application → Fournisseur (OP) : POST /token (grant_type=refresh_token)
  4. Fournisseur (OP) : Révoque l’ancien refresh token (rotation)
  5. Fournisseur (OP) → Application : Nouvel access token + nouveau refresh token
  6. Application → API : Authorization: Bearer nouvel access_token

À utiliser quand : Dès que vous voulez des access tokens courts tout en gardant la personne connectée longtemps (scope offline_access).

Ce qui le distingue : Ce n’est pas un flow de connexion : il prolonge une session obtenue avec un autre flow.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Client Credentials Machine à machine

Pas de personne : le service s’authentifie avec son secret.

ServiceFournisseur (OP)API1. POST /token(grant_type=client_credentials,scope)2. Vérifie le secret du client3. access token4. Authorization: Bearer access_token5. Données
Version texte du diagramme
  1. Service → Fournisseur (OP) : POST /token (grant_type=client_credentials, scope)
  2. Fournisseur (OP) : Vérifie le secret du client
  3. Fournisseur (OP) → Service : access token
  4. Service → API : Authorization: Bearer access_token
  5. API → Service : Données

À utiliser quand : Un service, une tâche planifiée ou un démon qui appelle une API en son nom propre.

Ce qui le distingue : Aucun navigateur, aucun ID token, aucun refresh token : seulement un access token limité aux scopes du client.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Mot de passe (ROPC) À éviter

L’application recueille elle-même le mot de passe et l’envoie au fournisseur.

PersonneApplicationFournisseur (OP)1. Saisit identifiant et mot depasse2. POST /token(grant_type=password, username,password)3. access token (+ refreshtoken) ou erreur
Version texte du diagramme
  1. Personne → Application : Saisit identifiant et mot de passe
  2. Application → Fournisseur (OP) : POST /token (grant_type=password, username, password)
  3. Fournisseur (OP) → Application : access token (+ refresh token) ou erreur

À utiliser quand : À éviter. Seulement pour une migration depuis un ancien système ou des tests automatisés.

Ce qui le distingue : Contourne la page du fournisseur : pas de MFA, pas de SSO, hameçonnage facilité.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Device Code (RFC 8628) Appareils sans navigateur

L’appareil affiche un court code ; la personne le valide sur son téléphone.

AppareilFournisseur (OP)Téléphone / ordinateur1. POST /device_authorization2. device_code, user_code,adresse3. Affiche « allez sur … etsaisissez ABCD-EFGH »4. Ouvre l’adresse, saisit lecode, se connecte5. POST /token (device_code) enboucle6. authorization_pending, puisles jetons
Version texte du diagramme
  1. Appareil → Fournisseur (OP) : POST /device_authorization
  2. Fournisseur (OP) → Appareil : device_code, user_code, adresse
  3. Appareil : Affiche « allez sur … et saisissez ABCD-EFGH »
  4. Téléphone / ordinateur → Fournisseur (OP) : Ouvre l’adresse, saisit le code, se connecte
  5. Appareil → Fournisseur (OP) : POST /token (device_code) en boucle
  6. Fournisseur (OP) → Appareil : authorization_pending, puis les jetons

À utiliser quand : Télévision, console, objet connecté, outil en ligne de commande.

Ce qui le distingue : La connexion se fait sur un autre appareil. L’appareil interroge le fournisseur jusqu’à validation.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Échange de jeton (RFC 8693) Cas précis

Échanger un jeton contre un autre, pour un autre destinataire.

API AFournisseur (OP)API B1. POST /token(grant_type=token-exchange,subject_token, audience=B)2. Contrôle droits et audience3. access token pour l’API B4. Authorization: Bearer nouveau jeton
Version texte du diagramme
  1. API A → Fournisseur (OP) : POST /token (grant_type=token-exchange, subject_token, audience=B)
  2. Fournisseur (OP) : Contrôle droits et audience
  3. Fournisseur (OP) → API A : access token pour l’API B
  4. API A → API B : Authorization: Bearer nouveau jeton

À utiliser quand : Une API qui doit en appeler une autre au nom de la personne, ou des microservices qui propagent l’identité.

Ce qui le distingue : Part d’un jeton déjà obtenu, sans nouvelle connexion. Peut réduire les droits ou changer l’audience.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Déconnexion (RP-initiated et back-channel) Session

Fermer la session chez le fournisseur et prévenir les autres applications.

NavigateurApplication AFournisseur (OP)Application B1. Clique sur « Se déconnecter »2. 302 vers /logout(id_token_hint,post_logout_redirect_uri)3. GET /logout4. Ferme la session dufournisseur5. POST logout_token(back-channel)6. 302 vers post_logout_redirect_uri
Version texte du diagramme
  1. Navigateur → Application A : Clique sur « Se déconnecter »
  2. Application A → Navigateur : 302 vers /logout (id_token_hint, post_logout_redirect_uri)
  3. Navigateur → Fournisseur (OP) : GET /logout
  4. Fournisseur (OP) : Ferme la session du fournisseur
  5. Fournisseur (OP) → Application B : POST logout_token (back-channel)
  6. Fournisseur (OP) → Navigateur : 302 vers post_logout_redirect_uri

À utiliser quand : Toute application avec connexion unique (SSO) : la déconnexion doit se propager.

Ce qui le distingue : Le back-channel prévient par serveur à serveur, sans passer par le navigateur (donc fiable).

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

Introspection et révocation Contrôle

Demander au fournisseur si un jeton est encore valable, ou l’invalider.

APIFournisseur (OP)1. POST /introspect (token)2. { "active": true, scope, exp,sub }3. POST /revoke (token)4. 200 : le jeton est invalide
Version texte du diagramme
  1. API → Fournisseur (OP) : POST /introspect (token)
  2. Fournisseur (OP) → API : { "active": true, scope, exp, sub }
  3. API → Fournisseur (OP) : POST /revoke (token)
  4. Fournisseur (OP) → API : 200 : le jeton est invalide

À utiliser quand : Une API qui reçoit un jeton opaque, ou qui veut une révocation immédiate.

Ce qui le distingue : Un JWT se vérifie seul par sa signature ; un jeton opaque exige cet appel.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

private_key_jwt et JWT Bearer (RFC 7523) Dans ID-Kit : fournisseur de test

Le client prouve son identité avec un JWT signé par sa clé privée, plutôt qu’avec un secret partagé.

ServiceFournisseur (OP)1. Signe un JWT (iss, sub,aud, exp, jti)2. POST /token(client_assertion,client_assertion_type)3. Vérifie la signature avecla clé publique du client4. access token
Version texte du diagramme
  1. Service : Signe un JWT (iss, sub, aud, exp, jti)
  2. Service → Fournisseur (OP) : POST /token (client_assertion, client_assertion_type)
  3. Fournisseur (OP) : Vérifie la signature avec la clé publique du client
  4. Fournisseur (OP) → Service : access token

À utiliser quand : Banque, santé, API sensibles, intégrations d’entreprise : aucun secret à stocker ni à faire tourner.

Ce qui le distingue : Même échange que client credentials, mais l’authentification est une assertion signée (client_assertion).

ID-Kit sait le jouer côté fournisseur de test (déclarez la clé publique de votre client, type « Confidentiel par clé »). Pas encore côté application de test.

PAR et JAR (RFC 9126 et 9101) Dans ID-Kit

La demande d’autorisation est déposée de serveur à serveur, au lieu de passer en clair dans l’adresse.

NavigateurApplicationFournisseur (OP)1. POST /par (tous lesparamètres, signés)2. request_uri (valable quelquessecondes)3. 302 vers/authorize?request_uri=…4. GET /authorize?request_uri=…5. Connexion puis redirection avec le code
Version texte du diagramme
  1. Application → Fournisseur (OP) : POST /par (tous les paramètres, signés)
  2. Fournisseur (OP) → Application : request_uri (valable quelques secondes)
  3. Application → Navigateur : 302 vers /authorize?request_uri=…
  4. Navigateur → Fournisseur (OP) : GET /authorize?request_uri=…
  5. Fournisseur (OP) → Navigateur : Connexion puis redirection avec le code

À utiliser quand : Exigences FAPI : empêcher qu’un paramètre soit modifié ou lu dans le navigateur.

Ce qui le distingue : Le navigateur ne porte plus qu’un request_uri opaque.

ID-Kit sait le jouer : fournisseur de test (votre application contre ID-Kit) et application de test (votre fournisseur contre ID-Kit).

JARM (réponse d’autorisation signée) Dans ID-Kit (fournisseur de test)

Le fournisseur signe aussi sa réponse : le code arrive dans un JWT, pas en clair dans l’adresse.

NavigateurApplicationFournisseur (OP)1. 302 vers/authorize?response_mode=jwt2. GET /authorize puis connexion3. Signe un JWT { iss, aud,code, state }4. Redirection vers l’application ?response=JWT5. Transmet response6. Vérifie la signature, iss,aud, puis lit le code
Version texte du diagramme
  1. Application → Navigateur : 302 vers /authorize?response_mode=jwt
  2. Navigateur → Fournisseur (OP) : GET /authorize puis connexion
  3. Fournisseur (OP) : Signe un JWT { iss, aud, code, state }
  4. Fournisseur (OP) → Navigateur : Redirection vers l’application ?response=JWT
  5. Navigateur → Application : Transmet response
  6. Application : Vérifie la signature, iss, aud, puis lit le code

À utiliser quand : FAPI 2.0, secteurs réglementés, protection contre les attaques de mélange entre fournisseurs.

Ce qui le distingue : Un seul paramètre « response » (JWT signé avec iss, aud, exp, code, state) remplace les paramètres en clair.

ID-Kit sait le jouer côté fournisseur de test (déclarez la clé publique de votre client, type « Confidentiel par clé »). Pas encore côté application de test.

DPoP (RFC 9449) Dans ID-Kit (fournisseur de test)

Le jeton est lié à une clé que seul le client possède : un jeton volé est inutilisable.

ApplicationFournisseur (OP)API1. Crée une paire de clés2. POST /token + en-tête DPoP(preuve signée)3. access token lié à la clé(cnf.jkt)4. Authorization: DPoP jeton + nouvelle preuve DPoP5. Vérifie la preuve et lelien avec la clé
Version texte du diagramme
  1. Application : Crée une paire de clés
  2. Application → Fournisseur (OP) : POST /token + en-tête DPoP (preuve signée)
  3. Fournisseur (OP) → Application : access token lié à la clé (cnf.jkt)
  4. Application → API : Authorization: DPoP jeton + nouvelle preuve DPoP
  5. API : Vérifie la preuve et le lien avec la clé

À utiliser quand : Haute sécurité, SPA exposées, API sensibles.

Ce qui le distingue : Chaque appel est accompagné d’une preuve signée (en-tête DPoP) prouvant la possession de la clé.

ID-Kit sait le jouer côté fournisseur de test (déclarez la clé publique de votre client, type « Confidentiel par clé »). Pas encore côté application de test.

CIBA (Client-Initiated Backchannel) Dans ID-Kit (fournisseur de test)

L’authentification se fait sur l’appareil de la personne, à l’initiative du serveur.

ApplicationFournisseur (OP)Téléphone1. POST /bc-authorize(login_hint, binding_message)2. auth_req_id3. Notification : « Autoriser cepaiement ? »4. La personne accepte5. POST /token (auth_req_id) enboucle, ou rappel6. Jetons
Version texte du diagramme
  1. Application → Fournisseur (OP) : POST /bc-authorize (login_hint, binding_message)
  2. Fournisseur (OP) → Application : auth_req_id
  3. Fournisseur (OP) → Téléphone : Notification : « Autoriser ce paiement ? »
  4. Téléphone → Fournisseur (OP) : La personne accepte
  5. Application → Fournisseur (OP) : POST /token (auth_req_id) en boucle, ou rappel
  6. Fournisseur (OP) → Application : Jetons

À utiliser quand : Centre d’appels, banque, validation d’un paiement par notification.

Ce qui le distingue : Aucune redirection du navigateur : le fournisseur sollicite directement la personne.

ID-Kit sait le jouer côté fournisseur de test (déclarez la clé publique de votre client, type « Confidentiel par clé »). Pas encore côté application de test.