Authorization Code Grant tiene algunos problemas de seguridad cuando se implementa en aplicaciones nativas. Por ejemplo, un atacante malicioso puede interceptar el authorization_code retornado por el Authorization Server y usarlo para obtener un Access Token.
La Proof Key for Code Exchange (PKCE), definida en https://tools.ietf.org/html/rfc7636, es una técnica usada para mitigar la intercepción del authorization_code.
Con PKCE la aplicación crea, por cada petición de autorización, una llave criptográfica aleatoria llamada code_verifier y su valor transformado llamado code_challenge el cual es enviado al Authorization Server para obtener un authorization_code y posteriormente enviarlo junto con el code_verifier para obtener un Access Token.
Conociendo el flujo
La aplicación nativa inicia el flujo y redirecciona al usuario al Authorization Server enviando los parámetros code_challenge y code_challenge_method.
El Authorization Server redirecciona el usuario a la aplicación nativa con un authorization_code en el query string.
La aplicación nativa envía el authorization_code y el code_verifier junto con la url de redireccionamiento (redirect_uri) y el client_id al Authorization Server.
El Authorization Server valida la información y retorna un Access Token.
La aplicación nativa ahora puede usar el Access Token para llamar los recursos en nombre del usuario (API).
Detalles de implementación
Vamos a ver los detalles de implementación usando JavaScript/Node.js, ya que son operaciones y request básicos que puede implementar cualquier lenguaje nativo. Para ver más detalles de una implementación especifica en lenguajes como Java o Swift pueden consultar una guía aquí.
Para comenzar el Authorization Code Grant (PKCE), nuestra aplicación nativa deberá enviar primero el usuario a la url de autorización incluyendo el code_challenge y el método usado para su generación y así obtener el authorization_code.
Ahora que nuestra aplicación tiene el authorization_code lo debemos cambiar por un Access Token que puede ser usado para hacer llamados a los recursos del usuario. Para ello obtenemos el authorization_code (code) de nuestro paso anterior y hacemos un llamado tipo POST al endpoint de obtención de token enviando también el code_verifier.