Клиент генерирует code_verifier длиной 43–128 символов из незарезервированных символов URL, отправляет в запросе авторизации code_challenge = BASE64URL(SHA256(code_verifier)) с code_challenge_method=S256, а затем доказывает владение, отправляя сам code_verifier на эндпоинт токена. Метод plain отправляет сам code_verifier в качестве challenge, и использовать его не следует.
PKCE создавался для мобильных приложений, где другие приложения могли перехватить URI перенаправления, но он также предотвращает внедрение кода авторизации в веб-приложениях, поэтому RFC 9700 рекомендует его для всех клиентов, а черновик OAuth 2.1 делает обязательным. Он не заменяет аутентификацию конфиденциальных клиентов, и сервер авторизации должен отклонять запросы токена без code_verifier, если ранее был отправлен challenge.