Aller au contenu

Le flux OAuth avec PKCE en une page

OAuth confie un code précieux au navigateur, cet endroit où cohabitent quarante onglets, onze extensions et une confiance aveugle ; PKCE part du principe, assez sain, que ce code finira un jour dans de mauvaises mains, et s’arrange pour qu’il n’y serve à rien.

Schéma animé en six étapes, sous forme de diagramme de séquence entre quatre acteurs : l'application légitime, une appli intruse installée sur le même appareil, le navigateur avec la personne, et le serveur d'autorisation. Un : l'application tire au hasard un secret, le verifier, et calcule son empreinte, challenge égale SHA-256 du verifier. Deux : elle redirige le navigateur vers /authorize en envoyant le challenge, la méthode S256 et un state. Trois : la personne se connecte chez le serveur (mot de passe, MFA) ; le serveur garde le challenge. Quatre : le serveur renvoie vers l'application un code et le state ; l'appli intruse en reçoit une copie. Cinq : l'intruse appelle /token avec le code, sans verifier ; le serveur refuse, invalid_grant. Six : l'application légitime appelle /token avec le code et le verifier ; le serveur vérifie que SHA-256 du verifier égale le challenge et délivre les jetons. Ce qui tient le flux : A, PKCE en S256, le code seul est inutile ; B, une adresse de retour exacte et un lien https vérifié, pour que l'intruse ne reçoive rien ; C, le state vérifié au retour ; D, un code bref et à usage unique. Limite : PKCE protège le code, pas le jeton une fois délivré.

  • Le navigateur ne porte qu’un code. Dans le flux du code d’autorisation (RFC 6749), le navigateur ne voit passer qu’un code éphémère ; l’application l’échange contre les jetons par un appel direct au point /token. La RFC recommande une durée de vie de dix minutes au plus et interdit de s’en servir deux fois.
  • Le maillon faible, c’est le retour. Sur un téléphone, un schéma d’URL personnalisé peut être revendiqué par deux applications (RFC 8252) ; ailleurs, le code traîne dans un journal, un historique ou une redirection trop permissive. On doit supposer qu’il fuit.
  • PKCE (RFC 7636) en trois gestes. L’application tire un code_verifier aléatoire de 43 à 128 caractères ; elle envoie à /authorize son empreinte, code_challenge = BASE64URL(SHA-256(code_verifier)), avec code_challenge_method=S256 ; à l’échange, elle présente le code_verifier, que le serveur hache et compare. Pas de correspondance : invalid_grant.
  • Un secret neuf à chaque connexion. Le vérificateur ne quitte l’application qu’au moment de l’échange, sous TLS, directement vers le serveur. L’empreinte, elle, peut se montrer : SHA-256 ne se remonte pas.
  • C’est désormais la règle. La RFC 9700 (bonnes pratiques de sécurité OAuth 2.0, janvier 2025) impose PKCE aux clients publics, le recommande aux clients confidentiels, écarte le flux implicite et le flux par mot de passe, et exige une comparaison exacte des adresses de retour.
  • OAuth délègue, OpenID Connect identifie. Le jeton d’accès dit ce qu’un client peut faire ; qui est connecté, c’est le jeton d’identité d’OIDC, délivré par le même échange.
  • PKCE protège un échange, pas tout le reste. Un jeton d’accès volé après délivrance, un navigateur compromis, des scopes trop larges ou un jeton accepté par la mauvaise API restent entiers.

Pour aller plus loin : Pièges OAuth 2.1 : PKCE, redirections et scopes · OIDC, SAML et OAuth 2.1 en fédération · Gérer la durée de vie des jetons OAuth · Configurer OIDC entre Keycloak et application interne · Attaque par confusion de scope OAuth · Connecteurs OAuth des assistants IA, portée et consentements.

À lire aussi

  • Gérer les accès externes des prestatairesConcevoir des accès externes, portails partenaires et fédérations inter-entreprises sans perdre la visibilité sur les identités tierces et la responsabilité des autorisations.
  • Faille Facebook Voir en tant que 2018 et vol de jetons d'accèsAnalyse de la faille Facebook Voir en tant que de septembre 2018, où trois bogues enchaînés ont livré des jetons d'accès, et de ce qu'elle impose à l'émission et à la révocation des jetons.
  • IETFRéférence centrale pour les RFC, les protocoles Internet et l’évolution concrète des standards réseau et sécurité.
  • Authentifier une API B2B hors annuaire interneChoisir, exploiter et révoquer les mécanismes d’authentification et d’autorisation pour les flux EDI et API B2B entre organisations.

Pages voisines