El cliente genera un code_verifier de 43 a 128 caracteres no reservados de URL, envía code_challenge = BASE64URL(SHA256(code_verifier)) con code_challenge_method=S256 en la solicitud de autorización y después demuestra la posesión enviando el verificador al endpoint de token. El método plain envía el propio verificador como desafío y no debería usarse.
Diseñado para aplicaciones móviles, donde otras aplicaciones podían capturar las URI de redirección, PKCE también impide la inyección de códigos de autorización en las aplicaciones web, por lo que el RFC 9700 lo recomienda para todos los clientes y el borrador de OAuth 2.1 lo exige. No sustituye a la autenticación del cliente en los clientes confidenciales, y el servidor de autorización debe rechazar las solicitudes de token que omitan el verificador cuando se envió un desafío.