O cliente gera um code_verifier de 43 a 128 caracteres não reservados de URL, envia code_challenge = BASE64URL(SHA256(code_verifier)) com code_challenge_method=S256 na requisição de autorização e depois prova a posse enviando o verificador ao endpoint de token. O método plain envia o próprio verificador como desafio e não é recomendável usá-lo.
Criado para aplicativos móveis, em que outros aplicativos poderiam capturar URIs de redirecionamento, o PKCE também impede a injeção de código de autorização em aplicações web; por isso, a RFC 9700 o recomenda para todos os clientes e o rascunho do OAuth 2.1 o exige. Ele não substitui a autenticação do cliente nos clientes confidenciais, e o servidor de autorização deve rejeitar requisições de token que omitam o verificador quando um desafio foi enviado.