Desencadenador de Lambda para definir el desafío de autenticación - Amazon Cognito

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

El activador Define Auth Challenge es una función 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ío y establece el siguiente desafío si la secuencia aún no se ha completado.

Desencadenadores de Lambda de desafío
Definición de desafíos de autenticación

Amazon Cognito invoca este desencadenador para iniciar el flujo de autenticación personalizado.

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.

Puede hacer que Amazon Cognito verifique las contraseñas de los usuarios antes de que emita los desafíos personalizados. Todos los activadores Lambda asociados a la categoría de autenticación de las cuotas de tasa de solicitudes se ejecutarán al realizar la SRP autenticación 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.

  2. 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.

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

  4. 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.

  5. 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.

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

El siguiente es un ejemplo de una InitiateAuth solicitud inicial que precede a la autenticación personalizada con un flujo. SRP

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

Parámetros del desencadenador de Lambda para definir el desafío de autenticación

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 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

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.

session

Matriz de ChallengeResult elementos. Cada matriz contiene los siguientes elementos:

challengeName

Uno de los siguientes tipos de desafío: CUSTOM_CHALLENGESRP_A,PASSWORD_VERIFIER,SMS_MFA,EMAIL_OTP,SOFTWARE_TOKEN_MFA, DEVICE_SRP_AUTHDEVICE_PASSWORD_VERIFIER, oADMIN_NO_SRP_AUTH.

Cuando su función de definición de desafío de autenticación genera un PASSWORD_VERIFIER desafío para un usuario que ha configurado la autenticación multifactor, Amazon Cognito continúa con SMS_MFA un desafíoEMAIL_OTP, o. SOFTWARE_TOKEN_MFA Estas son las instrucciones para obtener un código de autenticación multifactorial. En su función, incluya el manejo de los eventos de entrada procedentes de SMS_MFAEMAIL_OTP, y SOFTWARE_TOKEN_MFA los desafíos. No es necesario invocar ningún desafío en la MFA función de desafío de autenticación definida.

importante

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 AdminRespondToAuthChallengey RespondToAuthChallengeAPI. 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 AdminInitiateAuthlas operaciones y. InitiateAuthAPI

Parámetros de la respuesta a la definición de desafíos de autenticación

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

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.

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