PKCE (Proof Key for Code Exchange) es un mecanismo de seguridad de OAuth 2.0 que protege el flujo de autorización frente a ataques de interceptación del código de autorización (Authorization Code Interception Attack).
En términos simples, PKCE agrega una validación adicional entre la aplicación cliente y el servidor de autorización para garantizar que únicamente el cliente que inició el proceso pueda intercambiar el código de autorización por tokens de acceso.
¿Por qué se necesita?
Sin PKCE
- El usuario inicia el proceso de autenticación.
- El servidor devuelve un
authorization_code. - Si un tercero intercepta ese código, podría intentar intercambiarlo por tokens de acceso.
Con PKCE
- El cliente genera una clave temporal denominada
code_verifier. - A partir de esta clave genera un
code_challenge, que se envía durante la solicitud de autorización. - Cuando se realiza el intercambio del
authorization_codepor los tokens, el cliente debe enviar elcode_verifieroriginal. - El servidor valida que ambos valores coincidan.
De esta forma, aunque un tercero obtenga el authorization_code, no podrá utilizarlo sin conocer el code_verifier asociado.
¿Cómo funciona PKCE?
1. El cliente genera un code_verifier
El cliente genera un valor aleatorio y criptográficamente seguro denominado code_verifier.
Este valor se conserva localmente y será utilizado más adelante durante el intercambio del código de autorización por los tokens.
2. Genera el code_challenge
A partir del code_verifier, el cliente genera un code_challenge.
Aunque el estándar define diferentes métodos de transformación, FAPI requiere el uso del método:
S256
Este método aplica una función hash SHA-256 sobre el valor del code_verifier y posteriormente codifica el resultado en formato Base64URL.
En la colección de ejemplos se muestra cómo generar este valor.
3. Envía el code_challenge en la solicitud de autorización
El code_challenge debe enviarse como parte de la solicitud de autorización.
Cuando se utiliza el flujo con Pushed Authorization Request (PAR), este valor debe incluirse dentro de la solicitud enviada al endpoint PAR junto con el parámetro:
4. Intercambio del código por tokens
Una vez el usuario haya otorgado su consentimiento y el cliente reciba el authorization_code, deberá realizar la solicitud de intercambio de tokens.
Durante esta solicitud, el cliente debe enviar el code_verifier original generado en el primer paso.
El servidor de autorización calculará nuevamente el code_challenge a partir del code_verifier recibido y validará que coincida con el valor previamente registrado durante la solicitud de autorización.
Si la validación es exitosa, el servidor emitirá los tokens correspondientes.
Resumen
El flujo PKCE agrega una capa adicional de seguridad al proceso de autorización al vincular el authorization_code con un valor secreto temporal generado por el cliente.
Gracias a este mecanismo, un código de autorización interceptado no podrá reutilizarse para obtener tokens de acceso sin disponer del code_verifier original.
Conceptos clave
| Concepto | Descripción |
|---|---|
code_verifier | Valor aleatorio generado por el cliente y conservado localmente. |
code_challenge | Valor derivado del code_verifier mediante el método S256. |
code_challenge_method | Método utilizado para generar el code_challenge. En FAPI debe ser S256. |
authorization_code | Código temporal obtenido después de la autorización del usuario. |
Comentarios
0 comentarios
Inicie sesión para dejar un comentario.