

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.

# Desencadenadores de Lambda de desafío de autenticación personalizado
<a name="user-pool-lambda-challenge"></a>

Cuando cree flujos de autenticación para su grupo de usuarios de Amazon Cognito, puede querer que el modelo de autenticación no se limite a los flujos integrados. Normalmente, los desencadenadores de desafíos personalizados se suelen utilizar para implementar controles de seguridad adicionales, además del nombre de usuario, la contraseña y la autenticación multifactor (MFA). Un desafío personalizado es cualquier pregunta y respuesta que se pueda generar en un lenguaje de programación compatible con Lambda. Por ejemplo, puede que quiera solicitar a los usuarios que resuelvan un CAPTCHA o que respondan a una pregunta de seguridad antes de que se les permita autenticarse. También puede darse el caso de que necesite una integración con factores o dispositivos de autenticación especializados. O puede que ya haya desarrollado un software que autentique a los usuarios con una clave de seguridad de hardware o un dispositivo biométrico. La definición de autenticación correcta a un desafío personalizado es cualquier respuesta que su función de Lambda acepte como correcta; por ejemplo, una cadena fija o una respuesta satisfactoria de una API externa.

Puede iniciar la autenticación con el desafío personalizado y controlar el proceso de autenticación por completo, o puede realizar la autenticación con el nombre de usuario y la contraseña antes de que la aplicación reciba el desafío personalizado.

El desencadenador de Lambda de desafío de autenticación personalizado:

**[Define](user-pool-lambda-define-auth-challenge.md)**  
Inicia una secuencia de desafío. Determina si desea iniciar un nuevo desafío, marcar la autenticación como completa o detener el intento de autenticación.

**[Crea](user-pool-lambda-create-auth-challenge.md)**  
Remite a la aplicación la pregunta que el usuario debe responder. Esta función puede presentar una pregunta de seguridad o un enlace a un CAPTCHA que la aplicación debe mostrar al usuario.

**[Verifica](user-pool-lambda-verify-auth-challenge-response.md)**  
Conoce la respuesta esperada y la compara con la respuesta que proporciona la aplicación en la respuesta al desafío. La función puede llamar a la API de su servicio de CAPTCHA para recuperar el resultado esperado y compararla con la solución que el usuario propone.

Estas tres funciones de Lambda se encadenan para presentar un mecanismo de autenticación totalmente controlado y diseñado por usted. Como la autenticación personalizada requiere lógica de aplicación en el cliente y en las funciones de Lambda, no puede procesar la autenticación personalizada en el inicio de sesión administrado. Este sistema de autenticación requiere un esfuerzo adicional del desarrollador. La aplicación debe ejecutar el flujo de autenticación con la API de grupos de usuarios y gestionar el desafío resultante con una interfaz de inicio de sesión personalizada que sitúe la pregunta en el centro del desafío de autenticación personalizado.

![Desencadenadores de Lambda de desafío](http://docs.aws.amazon.com/es_es/cognito/latest/developerguide/images/lambda-challenges.png)


Para obtener más información sobre cómo implementar una autenticación personalizada, consulte [Flujo de autenticación personalizado y desafíos](amazon-cognito-user-pools-authentication-flow-methods.md#Custom-authentication-flow-and-challenges).

Autenticación entre las operaciones de la API [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)o [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html), y [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)o [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html). En este flujo, un usuario se autentica respondiendo a desafíos sucesivos hasta que se produce un error de autenticación o se emiten tokens para el usuario. Una respuesta a un desafío puede ser un desafío nuevo. En dicho caso, la aplicación responde tantas veces como sea necesario a los nuevos desafíos. La autenticación se considerará correcta cuando la función de definición del desafío de autenticación analice los resultados obtenidos hasta el momento, determine que se han resuelto todos los problemas y devuelva `IssueTokens`.

**Topics**
+ [Autenticación SRP en flujos de desafíos personalizados](#user-pool-lambda-challenge-srp-authentication)
+ [Desencadenador de Lambda para definir el desafío de autenticación](user-pool-lambda-define-auth-challenge.md)
+ [Desencadenador de Lambda para definir el desafío de autenticación](user-pool-lambda-create-auth-challenge.md)
+ [Desencadenador de Lambda para verificar la respuesta al desafío de autenticación](user-pool-lambda-verify-auth-challenge-response.md)

## Autenticación SRP en flujos de desafíos personalizados
<a name="user-pool-lambda-challenge-srp-authentication"></a>

Puede hacer que Amazon Cognito verifique las contraseñas de los usuarios antes de que emita los desafíos personalizados. Los desencadenadores de Lambda asociados a la categoría de autenticación de las [cuotas de recursos de solicitudes](quotas.md#category_operations.title) se ejecutarán al realizar la autenticación SRP en un flujo de desafío personalizado. Le presentamos la información general sobre el proceso:

1. La aplicación inicia sesión llamando a `InitiateAuth` o `AdminInitiateAuth` con el mapa `AuthParameters`. Los parámetros deben incluir `CHALLENGE_NAME: SRP_A,` y valores para `SRP_A` y `USERNAME`.

1. Amazon Cognito invoca su desencadenador de Lambda definición de desafío de autenticación con una sesión inicial que contiene `challengeName: SRP_A` y `challengeResult: true`.

1. Después de recibir estos datos de entrada, la función de Lambda responde con `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`.

1. Si la verificación de la contraseña se realiza de manera correcta, Amazon Cognito llama a la función de Lambda con una nueva sesión que contiene `challengeName: PASSWORD_VERIFIER` y `challengeResult: true`.

1. Para iniciar los desafíos personalizados, la función de Lambda responde con `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` y `failAuthentication: false`. Si no desea comenzar el flujo de autenticación personalizado con la verificación de la contraseña, puede iniciar sesión con el mapa `AuthParameters`, que incluye `CHALLENGE_NAME: CUSTOM_CHALLENGE`.

1. El bucle de desafíos se repite hasta que todos los desafíos tengan respuesta.

A continuación se muestra un ejemplo de una solicitud de inicio `InitiateAuth` que precede a la autenticación personalizada con un flujo de SRP.

```
{
    "AuthFlow": "CUSTOM_AUTH",
    "ClientId": "1example23456789",
    "AuthParameters": {
        "CHALLENGE_NAME": "SRP_A",
        "USERNAME": "testuser",
        "SRP_A": "[SRP_A]",
        "SECRET_HASH": "[secret hash]"
    }
}
```

### Restablecimiento de contraseñas en un flujo SRP de autenticación personalizada
<a name="user-pool-lambda-challenge-force-password-change"></a>

Cuando los usuarios se encuentran en el estado `FORCE_CHANGE_PASSWORD`, el flujo de autenticación personalizado debe integrar el paso de cambio de contraseña y, al mismo tiempo, mantener la integridad de los desafíos de autenticación. Amazon Cognito invoca el desencadenador de Lambda [Definir desafío de autenticación](user-pool-lambda-define-auth-challenge.md) durante el desafío `NEW_PASSWORD_REQUIRED`. En este escenario, un usuario que inicie sesión con un flujo de desafío personalizado y una autenticación SRP puede establecer una nueva contraseña si se encuentra en un estado de restablecimiento de contraseña.

Cuando los usuarios se encuentran en el estado `RESET_REQUIRED` o `FORCE_CHANGE_PASSWORD` deben [responder](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#API_RespondToAuthChallenge_RequestParameters) a un desafío `NEW_PASSWORD_REQUIRED` con un `NEW_PASSWORD`. En la autenticación personalizada con SRP, Amazon Cognito devuelve un desafío `NEW_PASSWORD_REQUIRED` después de que los usuarios completen el desafío `PASSWORD_VERIFIER` SRP. El desencadenador Definir desafío de autenticación recibe los dos resultados del desafío en la matriz `session` y puede continuar con desafíos personalizados adicionales una vez que el usuario haya cambiado correctamente su contraseña.

El desencadenador Definir desafío de autenticación de Lambda debe gestionar la secuencia de desafíos mediante la autenticación SRP, el restablecimiento de la contraseña y los subsiguientes desafíos personalizados. El desencadenador recibe una serie de desafíos completados en el parámetro `session`, incluidos los resultados de `PASSWORD_VERIFIER` y `NEW_PASSWORD_REQUIRED`. Para ver un ejemplo de implementación, consulte [Ejemplo de definición de desafíos de autenticación](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example).

#### Pasos de un flujo de autenticación
<a name="user-pool-lambda-challenge-password-flow-steps"></a>

Para los usuarios que necesitan verificar su contraseña antes de los desafíos personalizados, el proceso sigue estos pasos:

1. La aplicación inicia sesión llamando a `InitiateAuth` o `AdminInitiateAuth` con el mapa `AuthParameters`. Los parámetros deben incluir `CHALLENGE_NAME: SRP_A` y valores para `SRP_A` y `USERNAME`.

1. Amazon Cognito invoca su desencadenador de Lambda definición de desafío de autenticación con una sesión inicial que contiene `challengeName: SRP_A` y `challengeResult: true`.

1. Después de recibir estos datos de entrada, la función de Lambda responde con `challengeName: PASSWORD_VERIFIER`, `issueTokens: false`, `failAuthentication: false`.

1. Si la verificación de la contraseña se realiza correctamente, ocurre una de estas dos cosas:  
**Para los usuarios en estado normal:**  
Amazon Cognito llama a la función de Lambda con una nueva sesión que contiene `challengeName: PASSWORD_VERIFIER` y `challengeResult: true`.  
Para iniciar los desafíos personalizados, la función de Lambda responde con `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` y `failAuthentication: false`.  
**Para usuarios en el estado `RESET_REQUIRED` o `FORCE_CHANGE_PASSWORD`:**  
Amazon Cognito invoca a la función de Lambda con una sesión que contiene `challengeName: PASSWORD_VERIFIER` y `challengeResult: true`.  
La función Lambda debería responder con `challengeName: NEW_PASSWORD_REQUIRED`, `issueTokens: false` y `failAuthentication: false`.  
Tras cambiar correctamente la contraseña, Amazon Cognito invoca la función de Lambda con una sesión que contiene los resultados de `PASSWORD_VERIFIER` y `NEW_PASSWORD_REQUIRED`.  
Para iniciar los desafíos personalizados, la función de Lambda responde con `challengeName: CUSTOM_CHALLENGE`, `issueTokens: false` y `failAuthentication: false`.

1. El bucle de desafíos se repite hasta que todos los desafíos tengan respuesta.

Si no desea comenzar el flujo de autenticación personalizado con la verificación de la contraseña, puede iniciar sesión con el mapa `AuthParameters`, que incluye `CHALLENGE_NAME: CUSTOM_CHALLENGE`.

#### Administración de sesiones
<a name="user-pool-lambda-challenge-session-management"></a>

El flujo de autenticación mantiene la continuidad de la sesión a través de una serie de resultados de sesiones IDs y desafíos. Cada respuesta al desafío genera un nuevo identificador de sesión para evitar errores de reutilización de la sesión, lo cual es particularmente importante en los flujos de autenticación multifactor.

Los resultados del desafío se almacenan cronológicamente en la matriz de sesiones que reciben los desencadenadores Lambda. Para los usuarios en el estado `FORCE_CHANGE_PASSWORD`, la matriz de sesiones contiene lo siguiente:

1. `session[0]`: desafío `SRP_A` inicial

1. `session[1]`: desafío `PASSWORD_VERIFIER` inicial

1. `session[2]`: desafío `NEW_PASSWORD_REQUIRED` inicial

1. Elementos posteriores: resultados de desafíos personalizados adicionales

#### Ejemplo de flujo de autenticación
<a name="user-pool-lambda-challenge-example-flow"></a>

El siguiente ejemplo muestra un flujo de autenticación personalizado completo para un usuario en el estado `FORCE_CHANGE_PASSWORD` que debe completar tanto el cambio de contraseña como un desafío de CAPTCHA personalizado.

1. **InitiateAuth request**

   ```
   {
       "AuthFlow": "CUSTOM_AUTH",
       "ClientId": "{{1example23456789}}",
       "AuthParameters": {
           "CHALLENGE_NAME": "SRP_A",
           "USERNAME": "{{testuser}}",
           "SRP_A": "{{[SRP_A]}}"
       }
   }
   ```

1. **InitiateAuth respuesta**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ChallengeParameters": {
           "USER_ID_FOR_SRP": "{{testuser}}"
       },
       "Session": "{{[session_id_1]}}"
   }
   ```

1. **RespondToAuthChallenge solicitud con `PASSWORD_VERIFIER`**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "PASSWORD_CLAIM_SIGNATURE": "{{[claim_signature]}}",
           "PASSWORD_CLAIM_SECRET_BLOCK": "{{[secret_block]}}",
           "TIMESTAMP": "{{[timestamp]}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_1]}}"
   }
   ```

1. **RespondToAuthChallenge respuesta con `NEW_PASSWORD_REQUIRED` desafío**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ChallengeParameters": {},
       "Session": "{{[session_id_2]}}"
   }
   ```

1. **RespondToAuthChallenge solicitud con `NEW_PASSWORD_REQUIRED`**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "NEW_PASSWORD": "{{[password]}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_2]}}"
   }
   ```

1. **RespondToAuthChallenge respuesta con un desafío personalizado de CAPTCHA**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ChallengeParameters": {
           "captchaUrl": "url/123.jpg"
       },
       "Session": "{{[session_id_3]}}"
   }
   ```

1. **RespondToAuthChallenge solicitud con respuesta al desafío personalizado de CAPTCHA**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ClientId": "{{1example23456789}}",
       "ChallengeResponses": {
           "ANSWER": "{{123}}",
           "USERNAME": "{{testuser}}"
       },
       "Session": "{{[session_id_3]}}"
   }
   ```

**6. Respuesta final de éxito**

```
{
    "AuthenticationResult": {
        "AccessToken": "{{eyJra456defEXAMPLE}}",
        "ExpiresIn": 3600,
        "IdToken": "{{eyJra789ghiEXAMPLE}}",
        "RefreshToken": "{{eyJjd123abcEXAMPLE}}",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
```