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 la lógica de la aplicación en el cliente y en las funciones de Lambda, no puede procesar la autenticación personalizada en el inicio de sesión gestionado. Este sistema de autenticación requiere un esfuerzo adicional del desarrollador. La aplicación debe realizar 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 personalizada.

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 o. RespondToAuthChallengeAdminRespondToAuthChallenge 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 la contraseña en el flujo SRP de autenticación personalizada

Cuando los usuarios están en FORCE_CHANGE_PASSWORD estado, su 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 desencadenante Lambda del desafío de autenticación definido 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 FORCE_CHANGE_PASSWORD estado RESET_REQUIRED o, deben responder a un desafío con unNEW_PASSWORD_REQUIRED. NEW_PASSWORD En la autenticación personalizada con SRP, Amazon Cognito devuelve NEW_PASSWORD_REQUIRED un desafío después de que los usuarios completen el PASSWORD_VERIFIER desafío SRP. El activador del desafío de autenticación definido recibe los dos resultados del desafío en la session matriz y puede continuar con desafíos personalizados adicionales una vez que el usuario haya cambiado correctamente su contraseña.

El desencadenante de Lambda para definir el desafío de autenticación 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 activador recibe una serie de desafíos completados en el session parámetro, incluidos ambos PASSWORD_VERIFIER y los resultados. NEW_PASSWORD_REQUIRED Para ver un ejemplo de implementación, consulteEjemplo de definición de desafíos de autenticación.

Pasos del 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 incluirCHALLENGE_NAME: SRP_A, y los valores para SRP_A yUSERNAME.

  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 vuelve a invocar la función Lambda con una nueva sesión que contiene y. challengeName: PASSWORD_VERIFIER 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 RESET_REQUIRED estado o estado: FORCE_CHANGE_PASSWORD

    Amazon Cognito invoca la función Lambda con una sesión que contiene y. challengeName: PASSWORD_VERIFIER 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 Lambda con una sesión que contiene los resultados y. PASSWORD_VERIFIER 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 multifactorial.

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

  1. session[0]- SRP_A Desafío inicial

  2. session[1]- PASSWORD_VERIFIER resultado

  3. session[2]- NEW_PASSWORD_REQUIRED resultado

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