

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.

# 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 };
```

------