Desencadenadores de Lambda de desafío de autenticación personalizado - 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.

Desencadenadores de Lambda de desafío de autenticación personalizado

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

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

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

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

Para obtener más información sobre cómo implementar una autenticación personalizada, consulte Flujo de autenticación personalizado y desafíos.

Autenticación entre las operaciones de la API InitiateAutho AdminInitiateAuth, y RespondToAuthChallengeo. AdminRespondToAuthChallenge 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.

Autenticación SRP en flujos de desafíos personalizados

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

  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.

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

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

Pasos de un flujo de autenticación

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.

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

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

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

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

  3. session[2]: desafío NEW_PASSWORD_REQUIRED inicial

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

Ejemplo de flujo de autenticación

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]" } }
  2. InitiateAuth respuesta

    { "ChallengeName": "PASSWORD_VERIFIER", "ChallengeParameters": { "USER_ID_FOR_SRP": "testuser" }, "Session": "[session_id_1]" }
  3. 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]" }
  4. RespondToAuthChallenge respuesta con NEW_PASSWORD_REQUIRED desafío

    { "ChallengeName": "NEW_PASSWORD_REQUIRED", "ChallengeParameters": {}, "Session": "[session_id_2]" }
  5. RespondToAuthChallenge solicitud con NEW_PASSWORD_REQUIRED

    { "ChallengeName": "NEW_PASSWORD_REQUIRED", "ClientId": "1example23456789", "ChallengeResponses": { "NEW_PASSWORD": "[password]", "USERNAME": "testuser" }, "Session": "[session_id_2]" }
  6. RespondToAuthChallenge respuesta con un desafío personalizado de CAPTCHA

    { "ChallengeName": "CUSTOM_CHALLENGE", "ChallengeParameters": { "captchaUrl": "url/123.jpg" }, "Session": "[session_id_3]" }
  7. 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": {} }