4. Protocole
4.1 Le client crée un vérificateur de code
Le client crée d'abord un vérificateur de code "code_verifier" pour chaque demande d'autorisation OAuth 2.0 [RFC6749].
4.2 Le client crée le défi de code
Le client crée ensuite un défi de code (code challenge) dérivé du vérificateur de code en utilisant l'une des transformations suivantes :
plain
code_challenge = code_verifier
S256
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
Si le client est capable d'utiliser "S256", il doit utiliser "S256", car "S256" est obligatoire à implémenter (MTI) sur le serveur.
4.3 Le client envoie le défi de code avec la demande d'autorisation
Le client envoie le défi de code dans la demande d'autorisation OAuth 2.0 avec les paramètres supplémentaires suivants :
code_challenge : REQUIS. Défi de code.
code_challenge_method : OPTIONNEL, par défaut "plain". Méthode de transformation : "S256" ou "plain".
4.4 Le serveur retourne le code
Lorsque le serveur émet le code d'autorisation, il doit associer les valeurs "code_challenge" et "code_challenge_method" au code d'autorisation.
4.4.1 Réponse d'erreur
Si le serveur require PKCE et que le client n'envoie pas "code_challenge", le point de terminaison d'autorisation doit retourner une réponse d'erreur avec "error" défini sur "invalid_request".
4.5 Le client envoie le code d'autorisation et le vérificateur de code
À la réception du code d'autorisation, le client envoie la demande de jeton d'accès au point de terminaison de jeton avec le paramètre supplémentaire :
code_verifier : REQUIS. Vérificateur de code.
4.6 Le serveur vérifie code_verifier avant de retourner les jetons
Le serveur vérifie le code_verifier en calculant le défi de code et en le comparant au "code_challenge" précédemment associé.