

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": {}
}
```

# Desencadenador de Lambda para definir el desafío de autenticación
<a name="user-pool-lambda-define-auth-challenge"></a>

El desencadenador de definición de desafíos de autenticación es una función de Lambda que mantiene la secuencia de desafíos en un flujo de autenticación personalizado. Declara el éxito o el fracaso de la secuencia de desafíos y establece el siguiente desafío si la secuencia aún no se ha completado.

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


**Definir desafío de autenticación**  
 Amazon Cognito invoca este desencadenador para iniciar el [flujo de autenticación personalizado](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

La solicitud de este desencadenador de Lambda contiene `session`. El parámetro `session` es una matriz que cuenta con todos los desafíos que se presentan al usuario durante el proceso de autenticación actual. La solicitud también incluye el resultado correspondiente. La matriz `session` almacena los detalles del desafío (`ChallengeResult`) en orden cronológico. El desafío `session[0]` representa el primer desafío que recibe el usuario.

**Topics**
+ [Parámetros del desencadenador de Lambda para definir el desafío de autenticación](#cognito-user-pools-lambda-trigger-syntax-define-auth-challenge)
+ [Ejemplo de definición de desafíos de autenticación](#aws-lambda-triggers-define-auth-challenge-example)

## Parámetros del desencadenador de Lambda para definir el desafío de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge"></a>

La solicitud que Amazon Cognito envía a esta función de Lambda es una combinación de los parámetros que se indican a continuación y los [parámetros comunes](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
                . . .
        },
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "challengeName": "string",
        "issueTokens": boolean,
        "failAuthentication": boolean
    }
}
```

------

### Parámetros de la solicitud para definir desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-request"></a>

 Al llamar a la función Lambda, Amazon Cognito proporciona los siguientes parámetros:

**userAttributes**  
Uno o varios pares de nombre-valor que representan atributos de usuario.

**userNotFound**  
Valor booleano que rellena Amazon Cognito cuando `PreventUserExistenceErrors` se establece como `ENABLED` en el cliente del grupo de usuarios. Un valor de `true` significa que el ID de usuario (nombre de usuario, dirección de correo electrónico, etc.) no coincide con ningún usuario existente. Cuando `PreventUserExistenceErrors` se establece en `ENABLED`, el servicio no informa a la aplicación de la inexistencia de usuarios. Recomendamos que las funciones de Lambda mantengan la misma experiencia del usuario y tengan en cuenta la latencia. De esta forma, la persona que realiza la llamada no podrá detectar un comportamiento diferente si el usuario existe o no existe.

**sesión**  
Matriz de `ChallengeResult` elementos. Cada matriz contiene los siguientes elementos:    
**challengeName**  
Uno de los siguientes tipos de desafío: `CUSTOM_CHALLENGE`, `SRP_A`, `PASSWORD_VERIFIER`, `SMS_MFA`, `EMAIL_OTP`, `SOFTWARE_TOKEN_MFA`, `DEVICE_SRP_AUTH`, `DEVICE_PASSWORD_VERIFIER` o `ADMIN_NO_SRP_AUTH`.  
Cuando la función de definición de desafíos de autenticación emite un desafío `PASSWORD_VERIFIER` para un usuario que ha configurado la autenticación multifactor, Amazon Cognito lo continúa con un desafío `SMS_MFA`, `EMAIL_OTP` o `SOFTWARE_TOKEN_MFA`. Se trata de peticiones de código de autenticación multifactor. En su función, incluya la gestión de los eventos de entrada de los desafíos `SMS_MFA`, `EMAIL_OTP` y `SOFTWARE_TOKEN_MFA`. No necesita invocar ningún desafío de MFA desde la función de definición de desafíos de autenticación.  
Cuando la función determine si un usuario se ha autenticado de forma satisfactoria y deba emitirle tokens, compruebe siempre `challengeName` en la función de desafío de autenticación de definición y si coincide el valor esperado.  
**challengeResult**  
Establezca este parámetro en `true` si el usuario ha respondido correctamente al desafío o en `false`, en caso contrario.  
**challengeMetadata**  
El nombre del desafío personalizado. Solo se usa si `challengeName` es `CUSTOM_CHALLENGE`.

**clientMetadata**  
Uno o varios pares de clave-valor que puede proporcionar como datos de entrada personalizados a la función de Lambda que especifica destinada al desencadenador de Lambda para definir el desafío de autenticación. Para pasar estos datos a la función Lambda, puede usar el `ClientMetadata` parámetro en las operaciones [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)y [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. La solicitud que invoca la función de desafío de autenticación definida no incluye los datos transferidos en el ClientMetadata parámetro en [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)las operaciones de la API. [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)

### Parámetros de la respuesta a la definición de desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-response"></a>

En la respuesta puede devolver la etapa siguiente del proceso de autenticación.

**challengeName**  
Cadena que contiene el nombre del siguiente desafío. Si quiere plantear un nuevo desafío al usuario, especifique aquí el nombre de dicho desafío.

**issueTokens**  
Establezca este parámetro en `true` si cree que el usuario se ha autenticado suficientemente respondiendo a los desafíos. Si el usuario no ha respondido suficientemente a los desafíos, establézcalo en `false`.

**failAuthentication**  
Establezca este parámetro en `true` si desea finalizar el proceso de autenticación en curso. Para continuar el proceso de autenticación actual, establézcalo en `false`.

## Ejemplo de definición de desafíos de autenticación
<a name="aws-lambda-triggers-define-auth-challenge-example"></a>

En este ejemplo se definen una serie de desafíos de autenticación y se emiten tokens solo si el usuario ha completado correctamente todos los desafíos. Cuando los usuarios completan la autenticación SRP con los desafíos `SRP_A` y `PASSWORD_VERIFIER`, esta función les pasa un `CUSTOM_CHALLENGE` que invoca al desencadenador Crear desafío de autenticación. Junto con nuestro [ejemplo para Crear desafío de autenticación](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example), esta secuencia ofrece un desafío de CAPTCHA para el desafío tres y una pregunta de seguridad para el desafío cuatro.

Una vez que el usuario resuelve el CAPTCHA y responde a la pregunta de seguridad, esta función confirma que su grupo de usuarios puede emitir tokens. La autenticación SRP no es necesaria; también puede configurar el CAPTCHA y la pregunta de seguridad como desafíos uno y dos. Si la función Definir desafío de autenticación no declara desafíos SRP, el éxito de los usuarios dependerá exclusivamente de sus respuestas a las solicitudes personalizadas.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.session.length === 1 &&
    event.request.session[0].challengeName === "SRP_A"
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "PASSWORD_VERIFIER";
  } else if (
    event.request.session.length === 2 &&
    event.request.session[1].challengeName === "PASSWORD_VERIFIER" &&
    event.request.session[1].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 3 &&
    event.request.session[2].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[2].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 4 &&
    event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[3].challengeResult === true
  ) {
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  }

  return event;
};

export { handler };
```

------

# Desencadenador de Lambda para definir el desafío de autenticación
<a name="user-pool-lambda-create-auth-challenge"></a>

El desencadenador de creación de desafíos de autenticación es una función de Lambda que contiene los detalles de todos los desafíos que el desencadenador de definición de desafíos de autenticación ha declarado. Procesa el nombre del desafío que el desencadenador de definición de desafíos de autenticación ha declarado y devuelve un valor `publicChallengeParameters` que la aplicación debe presentar al usuario. A continuación, esta función proporciona al grupo de usuarios la respuesta al desafío, `privateChallengeParameters`, que el grupo de usuarios pasa, a su vez, al desencadenador de verificación del desafío de autenticación. Mientras que el desencadenador de definición de desafíos de autenticación administra la secuencia del desafío, el desencadenador de creación de desafíos de autenticación administra el contenido del desafío.

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


**Crear desafío de autenticación**  
Amazon Cognito invoca este desencadenador después de **Define Aut Challenge (Definir desafío de autenticación)** si se ha especificado un desafío personalizado como parte del desencadenador **Define Auth Challenge (Definir desafío de autenticación)**. Crea un [flujo de autenticación personalizado](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

Este desencadenador de Lambda se invoca para crear un desafío que se presenta al usuario. La solicitud de este desencadenador de Lambda incluye los parámetros `challengeName` y `session`. `challengeName` es una cadena y es el nombre del siguiente desafío al usuario. El valor de este atributo se establece en el desencadenador de Lambda para definir el desafío de autenticación.

El bucle de desafíos se repetirá hasta que todos los desafíos tengan respuesta.

**Topics**
+ [Parámetros del desencadenador de Lambda para crear el desafío de autenticación](#cognito-user-pools-lambda-trigger-syntax-create-auth-challenge)
+ [Ejemplo de creación de desafíos de autenticación](#aws-lambda-triggers-create-auth-challenge-example)

## Parámetros del desencadenador de Lambda para crear el desafío de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge"></a>

La solicitud que Amazon Cognito envía a esta función de Lambda es una combinación de los parámetros que se indican a continuación y los [parámetros comunes](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "challengeName": "string",
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "publicChallengeParameters": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeMetadata": "string"
    }
}
```

------

### Parámetros de la solicitud para crear desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-request"></a>

**userAttributes**  
Uno o varios pares de nombre y valor que representan atributos de usuario.

**userNotFound**  
Este valor booleano se rellena cuando `PreventUserExistenceErrors` se establece como `ENABLED` en el cliente del grupo de usuarios.

**challengeName**  
El nombre del nuevo desafío.

**sesión**  
El elemento session consiste en una matriz de elementos de `ChallengeResult` que contienen, cada uno, los elementos siguientes:    
**challengeName**  
El tipo de desafío. Uno de los siguientes: `"CUSTOM_CHALLENGE"`, `"PASSWORD_VERIFIER"`, `"SMS_MFA"`, `"DEVICE_SRP_AUTH"`, `"DEVICE_PASSWORD_VERIFIER"`, `"NEW_PASSWORD_REQUIRED"` o `"ADMIN_NO_SRP_AUTH"`.   
**challengeResult**  
Establezca este parámetro en `true` si el usuario ha respondido correctamente al desafío o en `false`, en caso contrario.  
**challengeMetadata**  
El nombre del desafío personalizado. Solo se usa si `challengeName` es `"CUSTOM_CHALLENGE"`.

**clientMetadata**  
Uno o varios pares de clave-valor que puede proporcionar como datos de entrada personalizados a la función de Lambda que especifica destinada al desencadenador para crear desafíos de autenticación. Puede usar el ClientMetadata parámetro en las acciones [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)y de la [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API para pasar estos datos a la función Lambda. La solicitud que invoca la función de desafío de creación de autenticación no incluye los datos transferidos en el ClientMetadata parámetro en [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)las operaciones de la API. [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)

### Parámetros de la respuesta para crear desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-response"></a>

**publicChallengeParameters**  
Uno o varios pares de clave y valor para que la aplicación cliente los use en el desafío que se va a presentar al usuario. Este parámetro debe contener toda la información necesaria para que el desafío que se presente al usuario sea preciso.

**privateChallengeParameters**  
Solo el desencadenador de Lambda para verificar la respuesta al desafío de autenticación utiliza este parámetro. Debe contener toda la información necesaria para validar la respuesta del usuario al desafío. Dicho de otro modo, el parámetro `publicChallengeParameters` contiene la pregunta que se formula al usuario y `privateChallengeParameters` contiene las respuestas válidas a la pregunta.

**challengeMetadata**  
El nombre del desafío personalizado, si se trata de uno.

## Ejemplo de creación de desafíos de autenticación
<a name="aws-lambda-triggers-create-auth-challenge-example"></a>

Esta función tiene dos desafíos personalizados que corresponden a la secuencia de desafíos de nuestro ejemplo de desafío con [Definir desafío de autenticación](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example). Los dos primeros desafíos son con autenticación SRP. Para el tercer desafío, esta función devuelve una URL de CAPTCHA a su aplicación en la respuesta al desafío. La aplicación renderiza el CAPTCHA en la URL indicada y devuelve los datos introducidos por el usuario. La URL de la imagen del CAPTCHA se añade a los parámetros de desafío públicos como "`captchaUrl`", mientras que la respuesta esperada se añade a los parámetros de desafío privados.

Para el cuarto desafío, esta función devuelve una pregunta de seguridad. La aplicación renderiza la pregunta y solicita al usuario su respuesta. Cuando los usuarios resuelvan los dos desafíos personalizados, el desencadenador Definir desafío de autenticación confirma que su grupo de usuarios puede emitir tokens.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (event.request.challengeName !== "CUSTOM_CHALLENGE") {
    return event;
  }

  if (event.request.session.length === 2) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.captchaUrl = "url/123.jpg";
    event.response.privateChallengeParameters.answer = "5";
  }

  if (event.request.session.length === 3) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.securityQuestion =
      "Who is your favorite team mascot?";
    event.response.privateChallengeParameters.answer = "Peccy";
  }

  return event;
};

export { handler };
```

------

# Desencadenador de Lambda para verificar la respuesta al desafío de autenticación
<a name="user-pool-lambda-verify-auth-challenge-response"></a>

El desencadenador de verificación del desafío de autenticación es una función de Lambda que compara la respuesta proporcionada por el usuario con una respuesta conocida. Esta función indica al grupo de usuarios si el usuario ha respondido correctamente al desafío. Cuando el desencadenador de verificación del desafío de autenticación responde `true` a `answerCorrect`, la secuencia de autenticación puede continuar.

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


**Verificación de la respuesta a los desafíos de autenticación**  
Amazon Cognito lama a este desencadenador para verificar si la respuesta del usuario a un desafío de autenticación personalizado es o no válida. Forma parte del [flujo de autenticación personalizado](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow) de un grupo de usuarios.

La solicitud de este disparador contiene los parámetros `privateChallengeParameters` y `challengeAnswer`. El desencadenador de Lambda para definir el desafío de autenticación devuelve los valores de `privateChallengeParameters`, que contienen la respuesta esperada del usuario. El parámetro `challengeAnswer` contiene la respuesta del usuario al desafío.

La respuesta contiene el atributo `answerCorrect`. Si el usuario finaliza correctamente el desafío, Amazon Cognito establece el valor del atributo en `true`. Si el usuario no finaliza correctamente el desafío, Amazon Cognito establece el valor del atributo en `false`.

El bucle de desafíos se repite hasta que los usuarios respondan a todos los desafíos.

**Topics**
+ [Parámetros del desencadenador de Lambda para verificar el desafío de autenticación](#cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge)
+ [Ejemplo de verificación de la respuesta a los desafíos de autenticación](#aws-lambda-triggers-verify-auth-challenge-response-example)

## Parámetros del desencadenador de Lambda para verificar el desafío de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge"></a>

La solicitud que Amazon Cognito envía a esta función de Lambda es una combinación de los parámetros que se indican a continuación y los [parámetros comunes](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeAnswer": "string",
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "answerCorrect": boolean
    }
}
```

------

### Parámetros de la solicitud para verificar desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-request"></a>

**userAttributes**  
Este parámetro contiene uno o varios pares de nombre-valor que representan atributos de usuario.

**userNotFound**  
Cuando Amazon Cognito establece `PreventUserExistenceErrors` en `ENABLED` para su cliente de grupo de usuarios, Amazon Cognito rellena este booleano.

**privateChallengeParameters**  
Este parámetro proviene del desencadenador para definir el desafío de autenticación. Para determinar si el usuario ha superado un desafío, Amazon Cognito compara los parámetros con la **challengeAnswer** de un usuario.  
Este parámetro contiene toda la información necesaria para validar la respuesta del usuario al desafío. Esta información incluye la pregunta que Amazon Cognito presenta al usuario (`publicChallengeParameters`) y las respuestas válidas a la pregunta (`privateChallengeParameters`). Solo el desencadenador de Lambda de verificación de la respuesta al desafío de autenticación utiliza este parámetro. 

**challengeAnswer**  
Este valor de parámetro es la respuesta del usuario al desafío.

**clientMetadata**  
Este parámetro contiene uno o varios pares de clave-valor que puede proporcionar como datos de entrada personalizados a la función de Lambda para verificar el desencadenador del desafío de autenticación. Para pasar estos datos a la función Lambda, utilice el ClientMetadata parámetro en las operaciones [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)y [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. Amazon Cognito no incluye datos del ClientMetadata parámetro ni de las operaciones de la [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API en la solicitud que pasa a la función de verificación de autenticación. [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)

### Parámetros de la respuesta para verificar desafíos de autenticación
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-response"></a>

**answerCorrect**  
Si el usuario finaliza correctamente el desafío, Amazon Cognito establece este parámetro en `true`. Si el usuario no finaliza correctamente el desafío, Amazon Cognito establece el parámetro en `false`. 

## Ejemplo de verificación de la respuesta a los desafíos de autenticación
<a name="aws-lambda-triggers-verify-auth-challenge-response-example"></a>

En este ejemplo, la función Verificar desafío de autenticación comprueba si la respuesta del usuario a un desafío coincide con la respuesta esperada. La respuesta del usuario se define en función de las entradas de la aplicación y la respuesta preferida se define por `privateChallengeParameters.answer` en la [respuesta del desencadenador Crear desafío de autenticación](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example). Tanto la respuesta correcta como la respuesta dada forman parte del evento de entrada de esta función.

En este ejemplo, Amazon Cognito establece el parámetro `answerCorrect` en `true` si la respuesta del usuario coincide con la respuesta esperada.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.privateChallengeParameters.answer ===
    event.request.challengeAnswer
  ) {
    event.response.answerCorrect = true;
  } else {
    event.response.answerCorrect = false;
  }

  return event;
};

export { handler };
```

------