

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de la PKCE en las concesiones de códigos de autorización
<a name="using-pkce-in-authorization-code"></a>

Amazon Cognito admite la autenticación con clave de prueba para el intercambio de códigos (PKCE) en las concesiones de códigos de autorización. La PKCE es una extensión de la concesión de códigos de autorización de OAuth 2.0 para clientes públicos. Este tipo de autenticación evita que se canjeen códigos de autorización interceptados.

## Cómo utiliza Amazon Cognito la PKCE
<a name="how-pkce-works"></a>

Para iniciar la autenticación con la PKCE, la aplicación debe generar un valor de cadena único. Esta cadena es el verificador de código, un valor secreto que Amazon Cognito utiliza para comparar el cliente que solicita la concesión de autorización inicial con el cliente que intercambia el código de autorización por tokens. 

La aplicación debe aplicar un SHA256 hash a la cadena del verificador de código y codificar el resultado en base64. Pase la cadena hash al [Autorizar punto de conexión](authorization-endpoint.md) como parámetro `code_challenge` en el cuerpo de la solicitud. Cuando la aplicación intercambie el código de autorización por tokens, debe incluir la cadena verificadora de código en texto simple como parámetro `code_verifier` en el cuerpo de la solicitud al [Punto de conexión de token](token-endpoint.md). Amazon Cognito realiza la misma hash-and-encode operación en el verificador de código. Amazon Cognito solo devuelve los tokens de ID, acceso y actualización si concluye que el verificador de código genera el mismo desafío de código que ha recibido en la solicitud de autorización.

**Implementación del flujo de concesión de autorizaciones con la PKCE**

1. Abra la [consola de Amazon Cognito](https://console.aws.amazon.com/cognito/home). Si se le solicita, introduzca sus credenciales. AWS 

1. Elija **User Pools** (Grupos de usuarios).

1. Elija un grupo de usuarios existente en la lista o cree un grupo de usuarios. Si crea un grupo de usuarios, se le pedirá que configure un cliente de aplicación y configure el inicio de sesión administrado durante el asistente.

   1. Si crea un nuevo grupo de usuarios, configure un cliente de aplicación y el inicio de sesión administrado durante la configuración guiada.

   1. Si configura un grupo de usuarios ya existente, añada un [dominio](cognito-user-pools-assign-domain.md) y un [cliente de aplicación público](user-pool-settings-client-apps.md), si aún no lo ha hecho.

1. Genere una cadena alfanumérica aleatoria, normalmente un identificador único universal ([UUID](cognito-terms.md#terms-uuid)), para crear un desafío de código para la PKCE. Esta cadena es el valor del parámetro `code_verifier` que enviará en la solicitud al [Punto de conexión de token](token-endpoint.md). 

1. Aplica un hash a la `code_verifier` cadena con el SHA256 algoritmo. Codifique el resultado de la operación de hash en base64. Esta cadena es el valor del parámetro `code_challenge` que enviará en la solicitud al [Autorizar punto de conexión](authorization-endpoint.md). 

   El siguiente ejemplo de Python genera un `code_verifier` y calcula el `code_challenge`:

   ```
   #!/usr/bin/env python3
   
   import secrets
   from base64 import urlsafe_b64encode
   from hashlib import sha256
   from string import ascii_letters
   from string import digits
   
   # use the secrets module for cryptographically strong random values
   alphabet = ascii_letters + digits
   code_verifier = ''.join(secrets.choice(alphabet) for _ in range(128))
   code_verifier_hash = sha256(code_verifier.encode()).digest()
   code_challenge = urlsafe_b64encode(code_verifier_hash).decode().rstrip('=')
   
   print(f"code challenge: {code_challenge}")
   print(f"code verifier: {code_verifier}")
   ```

   A continuación se muestra un ejemplo de salida de script de Python:

   ```
   code challenge: Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg
   code verifier: 9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. Complete el inicio de sesión con el inicio de sesión administrado mediante una solicitud de concesión de código de autorización con PKCE. A continuación se muestra un ejemplo de URL:

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&code_challenge=Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg&code_challenge_method=S256
   ```

1. Obtenga la autorización `code` y canjéela por tokens con el punto de conexión del token. A continuación, se muestra un ejemplo de solicitud:

   ```
   POST /oauth2/token HTTP/1.1
   Host: mydomain.auth.us-east-1.amazoncognito.com
   Content-Type: application/x-www-form-urlencoded
   Content-Length: 296
   
   redirect_uri=https%3A%2F%2Fwww.example.com&
   client_id=1example23456789&
   code=7378f445-c87f-400c-855e-0297d072ff03&
   grant_type=authorization_code&
   code_verifier=9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
   ```

1. Revise la respuesta. Contendrá tokens de ID, acceso y actualización. Para obtener más información sobre el uso de tokens de grupos de usuarios de Amazon Cognito, consulte [Descripción de los tokens web JSON para grupos de usuarios (JWTs)](amazon-cognito-user-pools-using-tokens-with-identity-providers.md).