Skip to main content

Skillber v1.0 is here!

Learn more

Autorisation OAuth 2.0

Checking access...

OAuth 2.0 est le standard de l’industrie pour l’autorisation déléguée. Il permet à une application d’obtenir un accès limité à des ressources protégées au nom d’un utilisateur sans exposer les identifiants de ce dernier. OpenID Connect (OIDC) ajoute une couche d’authentification au-dessus d’OAuth 2.0.

Rôles OAuth 2.0

RôleDescriptionExemple
Resource Owner (Propriétaire de la ressource)Entité qui peut accorder l’accès à une ressource protégéeL’utilisateur final
Client (Application)Application demandant l’accès à une ressource protégéeApplication web, application mobile, script
Authorization Server (AS)Serveur qui délivre des jetons d’accès après authentificationOkta, Azure AD, Auth0, Keycloak
Resource Server (RS)Serveur hébergeant les ressources protégées, validant les jetonsAPI REST, serveur de fichiers

Types d’Octroi OAuth 2.0

Type d’OctroiCas d’UsageSécuritéNécessite Secret Client
Code d’Autorisation (Authorization Code)Application web avec backendTrès élevéeOui
Code d’Autorisation + PKCEApplication mobile, SPATrès élevéeNon
Implicite (Implicit)Déprécié — ne plus utiliserFaibleNon (obsolète dans OAuth 2.1)
Mot de passe (Password)Déprécié — ne plus utiliserFaibleOui
Identifiants Client (Client Credentials)Application à application, M2MÉlevéeOui
Jeton de Rafraîchissement (Refresh Token)Obtention de nouveaux access tokensVariableOui
Appareil (Device Code)Appareils sans navigateur (TV, CLI)MoyenneNon

Flux du Code d’Autorisation avec PKCE

PKCE (Proof Key for Code Exchange, RFC 7636) protège contre l’interception du code d’autorisation :

Application Mobile Authorization Server
│ │
│ 1. Générer code_verifier │
│ 2. Calculer code_challenge │
│ = SHA256(code_verifier) │
│ │
│ 3. Demande d'autorisation │
│ + code_challenge │
│──────────────────────────────────────>│
│ │
│ 4. Authentification utilisateur │
│ (Navigateur externe ou in-app) │
│<──────────────────────────────────────│
│ │
│ 5. Code d'autorisation │
│<──────────────────────────────────────│
│ │
│ 6. Échange : code + code_verifier │
│──────────────────────────────────────>│
│ │
│ 7. Vérifier SHA256(code_verifier) │
│ == code_challenge │
│ │
│ 8. Access Token + Refresh Token │
│<──────────────────────────────────────│
│ │
│ 9. Appeler API avec Access Token │
│──────────────────────────────────────>│
│ │
│ 10. Réponse API │
│<──────────────────────────────────────│

Types de Jetons

Access Token

PropriétéValeur Typique
FormatJWT (JSON Web Token) ou opaque
Contenusub, aud, iss, exp, iat, scopes
Durée de vie15-60 minutes
ValidationSignature (RS256/ES256), audience, expiration
TransportAuthorization: Bearer &lt;token&gt;

Exemple de JWT Access Token décodé :

{
"iss": "https://auth.example.com",
"sub": "user_12345",
"aud": "https://api.example.com",
"exp": 1718000000,
"iat": 1717996400,
"scope": "openid profile email read:reports write:reports",
"roles": ["analyst", "report_viewer"]
}

ID Token (OIDC)

L’ID Token est un JWT qui contient les claims d’identité de l’utilisateur :

ClaimDescriptionToujours Présent ?
issÉmetteur du jetonOui
subIdentifiant unique du sujetOui
audAudience (destinataire du jeton)Oui
expDate d’expirationOui
iatDate d’émissionOui
auth_timeMoment de l’authentificationOptionnel
nonceValeur unique liant la sessionOui (si fourni dans la requête)
at_hashHash de l’Access TokenOptionnel
c_hashHash du code d’autorisationOptionnel
emailAdresse email (si scope email)Optionnel

OIDC — Couche d’Identité

OIDC étend OAuth 2.0 en ajoutant un flux d’authentification standardisé :

OAuth 2.0 : "Cette application peut-elle accéder aux rapports au nom de Jean ?"
OIDC : "Qui est Jean ?" + "Cette application peut-elle accéder aux rapports au nom de Jean ?"

Mapping Scope vers Claim OIDC

ScopeClaims InclusUsage
openidsub (toujours inclus)REQUIS pour OIDC
profilename, family_name, given_name, pictureProfil utilisateur
emailemail, email_verifiedCommunication
addressaddress (format json structuré)Adresse postale
phonephone_number, phone_number_verifiedContact téléphonique

DPoP — Demonstration of Proof-of-Possession

DPoP (RFC 9449) lie un Access Token à un client spécifique via une clé publique :

1. Client génère une paire de clés (publique/privée)
2. Inclut la clé publique (thumbprint) dans la demande d'autorisation
3. Le serveur inclut cnf (confirmation) avec le thumbprint dans l'Access Token
4. À chaque requête API, le client prouve la possession de la clé privée
5. Même si le jeton est intercepté, l'attaquant ne peut pas l'utiliser sans la clé privée

OAuth 2.1 — Principaux Changements

ChangementOAuth 2.0OAuth 2.1
Octroi impliciteAutoriséSupprimé
Octroi mot de passeAutoriséSupprimé
PKCE obligatoireOptionnel (recommandé)Obligatoire pour tous les clients
Refresh Token rotationOptionnelRecommandé (rotation automatique)
Refresh Token sender-constrainedOptionnelRecommandé (DPoP ou mTLS)
Redirect URI exact matchPattern matching autoriséCorrespondance exacte obligatoire

Points Clés à Retenir

  • OAuth 2.0 définit quatre rôles (Resource Owner, Client, Authorization Server, Resource Server) et plusieurs types d’octroi — le code d’autorisation avec PKCE est le flux recommandé pour toutes les applications modernes
  • PKCE (RFC 7636) protège contre l’interception du code d’autorisation — le client génère un code_verifier aléatoire, envoie SHA256(code_verifier) comme code_challenge dans la demande d’autorisation, et prouve sa possession lors de l’échange du code
  • Les types d’octroi implicite et mot de passe sont dépréciés dans OAuth 2.1 — les applications legacy doivent migrer vers le code d’autorisation avec PKCE ou les identifiants client pour les flux M2M
  • OpenID Connect (OIDC) ajoute une couche d’identité à OAuth 2.0 avec l’ID Token (JWT contenant les claims utilisateur) et le scop openid requis — OAuth sans OIDC ne fournit que l’autorisation, pas l’authentification
  • DPoP (RFC 9449) lie l’Access Token à un client spécifique via une paire de clés — même si le jeton est intercepté, l’attaquant ne peut pas l’utiliser sans la clé privée
  • OAuth 2.1 supprime les flux implicite et mot de passe, rend PKCE obligatoire pour tous les clients, et recommande la rotation des refresh tokens avec sender-constraining (DPoP ou mTLS)