Flujo de autenticación de los grupos de usuarios - 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.

Flujo de autenticación de los grupos de usuarios

Amazon Cognito incluye varios métodos para autenticar a los usuarios. Todos los grupos de usuarios, tengan o no un dominio, pueden autenticar usuarios en la API de grupos de usuarios. Si agrega un dominio al grupo de usuarios, puede utilizar los puntos de conexión del grupo de usuarios. La API de grupos de usuarios admite una variedad de modelos de autorización y flujos de solicitud para las solicitudes de API.

Para verificar la identidad de los usuarios, Amazon Cognito admite flujos de autenticación que incorporan nuevos tipos de desafíos, además de las contraseñas. La autenticación de Amazon Cognito suele requerir que implemente dos operaciones de la API en el siguiente orden:

Public authentication

InitiateAuth y RespondToAuthChallenge son API no autenticadas que se usan con clientes de aplicaciones públicas del lado del cliente.

Server-side authentication

AdminInitiateAuth y AdminRespondToAuthChallenge requieren credenciales de IAM y son adecuadas para clientes de aplicaciones confidenciales del lado del servidor.

Un usuario se autentica respondiendo a desafíos sucesivos hasta que se produce un error de autenticación o Amazon Cognito emite tokens para el usuario. Puede repetir estos pasos con Amazon Cognito, en un proceso que incluye diferentes desafíos, para admitir cualquier flujo de autenticación personalizado.

Por lo general, la aplicación genera un mensaje para recopilar información del usuario y envía esa información en una solicitud de API a Amazon Cognito. Considere un flujo de InitiateAuth en un grupo de usuarios en el que ha configurado el usuario con autenticación multifactor (MFA).

  1. La aplicación pide a los usuarios el nombre de usuario y la contraseña.

  2. El nombre de usuario y la contraseña se incluyen como parámetros en InitiateAuth.

  3. Amazon Cognito devuelve un desafío de SMS_MFA y un identificador de sesión.

  4. La aplicación solicita al usuario el código de MFA desde el teléfono.

  5. Debe incluir ese código y el identificador de sesión en la solicitud RespondToAuthChallenge.

Según las características del grupo de usuarios, puede terminar respondiendo a varios desafíos para InitiateAuth antes de que la aplicación recupere los tokens de Amazon Cognito. Amazon Cognito incluye una cadena de sesión en la respuesta a cada solicitud. Para combinar las solicitudes de la API en un flujo de autenticación, incluya la cadena de sesión de la respuesta a la solicitud anterior en cada solicitud posterior. De forma predeterminada, los usuarios tienen tres minutos para completar cada desafío antes de que caduque la cadena de sesión. Para ajustar este periodo, cambie el cliente de la aplicación Duración de la sesión de flujo de autenticación. En el siguiente procedimiento, se describe cómo cambiar esta configuración en la configuración del cliente de la aplicación.

nota

La configuración de la duración de la sesión del flujo de autenticación se aplica a la autenticación con la API de los grupos de usuarios de Amazon Cognito. La interfaz de usuario alojada en Amazon Cognito establece la duración de la sesión en 3 minutos para la autenticación multifactorial y 8 minutos para los códigos de restablecimiento de contraseña.

Amazon Cognito console
Para configurar la duración de la sesión del flujo de autenticación del cliente (AWS Management Console)
  1. En la pestaña App integration (Integración de aplicaciones) de su grupo de usuarios, seleccione el nombre de su cliente de aplicaciones en el contenedor App clients and analytics (Clientes de aplicaciones y análisis).

  2. Elija Editar en el contenedor de Información de cliente de aplicaciones.

  3. Cambie el valor de Authentication flow session duration (Duración de la sesión de flujo de autenticación) a la duración de validez que desee, en minutos, para los códigos MFA de SMS. Esto también cambia la cantidad de tiempo que tiene cualquier usuario para completar cualquier desafío de autenticación en el cliente de la aplicación.

  4. Elija Guardar cambios.

Amazon Cognito API
Para configurar la duración de la sesión del flujo de autenticación del cliente (API Amazon Cognito)
  1. Prepare una solicitud UpdateUserPoolClient con la configuración de su grupo de usuarios existente desde una solicitud DescribeUserPoolClient. Su solicitud UpdateUserPoolClient debe incluir todas las propiedades del cliente de la aplicación existentes.

  2. Cambie el valor de AuthSessionValidity a la duración de validez que desee, en minutos, para los códigos MFA de SMS. Esto también cambia la cantidad de tiempo que tiene cualquier usuario para completar cualquier desafío de autenticación en el cliente de la aplicación.

Para obtener más información acerca de los clientes de aplicación, consulte Clientes de aplicación de grupo de usuarios.

Puede usar AWS Lambda activadores para personalizar la forma en que los usuarios se autentican. Estos disparadores emiten y verifican sus propios desafíos durante el flujo de autenticación.

También puede utilizar el flujo de autenticación de administrador para servidores backend seguros. También puede utilizar el flujo de autenticación de migración de usuarios para permitir la migración de usuarios sin necesidad de que estos restablezcan sus contraseñas.

Comportamiento de bloqueo de Amazon Cognito por intentos de inicio de sesión con error

Tras cinco intentos infructuosos de inicio de sesión no autenticado o de inicio de sesión autenticado por IAM con una contraseña, Amazon Cognito bloquea al usuario durante un segundo. La duración del bloqueo se duplica después de cada intento fallido adicional, hasta un máximo de aproximadamente 15 minutos. Los intentos realizados durante un periodo de bloqueo generan una excepción Password attempts exceeded y no afectan a la duración de los periodos de bloqueo posteriores. Para un número acumulado de intentos de inicio de sesión con error n, sin incluir las excepciones Password attempts exceeded, Amazon Cognito bloquea a su usuario durante 2^(n-5) segundos. Para restablecer el bloqueo a su estado inicial n=0, su usuario debe iniciar sesión correctamente después de que venza un periodo de bloqueo, o no iniciar ningún intento de inicio de sesión durante 15 minutos consecutivos en cualquier momento después de un bloqueo. Este comportamiento está sujeto a cambios. Este comportamiento no se aplica a los desafíos personalizados, a menos que también realicen una autenticación basada en contraseña.

Flujo de autenticación en el lado del cliente

El siguiente proceso funciona para las aplicaciones de usuario en el cliente que cree con AWS Amplify o los SDK de AWS.

  1. El usuario introduce su nombre de usuario y contraseña en la aplicación.

  2. La aplicación llama a la operación InitiateAuth con el nombre de usuario y los detalles de contraseña remota segura (SRP) del usuario.

    Esta operación de la API devuelve los parámetros de autenticación.

    nota

    La aplicación genera detalles de SRP con las funciones SRP de Amazon Cognito que están integradas en los SDK de AWS .

  3. La aplicación llama a la operación RespondToAuthChallenge. Si la llamada se realiza correctamente, Amazon Cognito devuelve los tokens del usuario y el flujo de autenticación finaliza.

    Si Amazon Cognito necesita otro desafío, la llamada a RespondToAuthChallenge no devuelve ningún token. En su lugar, la llamada devuelve una sesión.

  4. Si RespondToAuthChallenge devuelve una sesión, la aplicación llama de nuevo a RespondToAuthChallenge, esta vez con la sesión y la respuesta al desafío (por ejemplo, código de MFA).

Flujo de autenticación en el lado del servidor

Si no dispone de una aplicación de usuario, sino que usa una aplicación segura del backend o del lado del servidor en Java, Ruby o Node.js, puede utilizar la API autenticada del lado del servidor para los grupos de usuarios de Amazon Cognito.

En el caso de las aplicaciones del lado del servidor, la autenticación de grupos de usuarios es similar a la de las aplicaciones del lado del cliente, excepto en el siguiente caso:

  • La aplicación del lado del servidor llama a la operación de API AdminInitiateAuth (en lugar de InitiateAuth). Esta operación requiere AWS credenciales con permisos que incluyan cognito-idp:AdminInitiateAuth ycognito-idp:AdminRespondToAuthChallenge. Esta operación devuelve los parámetros de autenticación requeridos.

  • Una vez que la aplicación del lado del servidor tiene los parámetros de autenticación, llama a la operación de la API AdminRespondToAuthChallenge (en lugar de RespondToAuthChallenge). La operación AdminRespondToAuthChallenge de la API solo se realiza correctamente si se proporcionan AWS las credenciales.

Para obtener más información sobre cómo firmar las solicitudes de la API de Amazon Cognito con AWS credenciales, consulte el proceso de firma de la versión 4 de Signature en la Referencia AWS general.

Las operaciones AdminInitiateAuth y la AdminRespondToAuthChallenge API no pueden aceptar credenciales de username-and-password usuario para el inicio de sesión de administrador, a menos que las habilite explícitamente de una de las siguientes maneras:

  • Incluya ALLOW_ADMIN_USER_PASSWORD_AUTH (anteriormente llamado ADMIN_NO_SRP_AUTH) en el parámetro ExplicitAuthFlow cuando llame a CreateUserPoolClient o a UpdateUserPoolClient.

  • Agregue ALLOW_ADMIN_USER_PASSWORD_AUTH a la lista de Flujos de autenticación para el cliente de la aplicación. Configure clientes de aplicaciones en la pestaña App integration (Integración de aplicaciones) en el grupo de usuarios, bajo App clients and analytics (Clientes de aplicaciones y análisis). Para obtener más información, consulte Clientes de aplicación de grupo de usuarios.

Flujo de autenticación personalizado

Los grupos de usuarios de Amazon Cognito también permiten utilizar flujos de autenticación personalizados, lo que puede ayudarle a crear un modelo de autenticación basado en desafíos/respuestas mediante activadores. AWS Lambda

nota

No puede utilizar las funciones de seguridad avanzadas para las credenciales comprometidas ni la autenticación adaptativa con flujos de autenticación personalizados. Para obtener más información, consulte Adición de seguridad avanzada a un grupo de usuarios.

El flujo de autenticación personalizado hace posible los ciclos de desafíos y respuestas personalizados para satisfacer diferentes requisitos. El flujo comienza con una llamada a la operación de la API InitiateAuth, que indica el tipo de autenticación que debe utilizarse y proporciona todos los parámetros de autenticación iniciales. Amazon Cognito responde a la llamada InitiateAuth con uno de los siguientes tipos de información:

  • Un desafío para el usuario junto con una sesión y parámetros.

  • Un error si el usuario no se autentica correctamente.

  • Tokens de ID, acceso y actualización, si los parámetros proporcionados en la llamada InitiateAuth son suficientes para que el usuario inicie sesión. (Por lo general, el usuario o la aplicación deben responder primero a un desafío, pero el código personalizado debe determinarlo).

Si Amazon Cognito responde a la llamada InitiateAuth con un desafío, la aplicación reunirá más información y llamará a la operación RespondToAuthChallenge, lo que proporciona las respuestas al desafío y vuelve a pasar la sesión. Amazon Cognito responde a la llamada RespondToAuthChallenge de forma similar a la llamada InitiateAuth. Si el usuario ha iniciado sesión, Amazon Cognito proporciona tokens o si el usuario no ha iniciado sesión, Amazon Cognito proporciona otro desafío o un error. Si devuelve otro desafío, la secuencia se repite y la aplicación llama a RespondToAuthChallenge hasta que el usuario inicie sesión correctamente o se devuelva un error. Para obtener más información sobre las operaciones de la API InitiateAuth and RespondToAuthChallenge, consulte la documentación de la API.

Flujo de autenticación integrado y desafíos

Amazon Cognito contiene algunos valores de AuthFlow y ChallengeName integrados para que un flujo de autenticación estándar pueda validar el nombre de usuario y la contraseña mediante el protocolo de contraseña remota segura (SRP). Los AWS SDK cuentan con soporte integrado para estos flujos con Amazon Cognito.

El flujo comienza enviando USER_SRP_AUTH como el AuthFlow a InitiateAuth. También envía los valores USERNAME y SRP_A en AuthParameters. Si la llamada InitiateAuth tiene éxito, la respuesta incluye PASSWORD_VERIFIER como ChallengeName y SRP_B en los parámetros del desafío. La aplicación llamará a continuación a RespondToAuthChallenge con el ChallengeName PASSWORD_VERIFIER y los parámetros necesarios en ChallengeResponses. Si la llamada a RespondToAuthChallenge se efectúa de manera correcta y el usuario inicia sesión, Amazon Cognito emite tokens. Si ha activado la autenticación multifactor (MFA) para el usuario, Amazon Cognito devuelve el ChallengeName de SMS_MFA. La aplicación puede proporcionar el código necesario a través de otra llamada a RespondToAuthChallenge.

Flujo de autenticación personalizado y desafíos

Una aplicación puede iniciar un flujo de autenticación personalizado llamando a InitiateAuth con CUSTOM_AUTH como Authflow. En el caso de un flujo de autenticación personalizado, tres desencadenadores de Lambda controlan los desafíos y la verificación de las respuestas.

  • El desencadenador de Lambda DefineAuthChallenge toma como entrada una matriz de sesiones de desafíos y respuestas anteriores. Luego genera los siguientes nombres de desafíos y valores booleanos que indican si el usuario está autenticado y se le deben otorgar tokens. Este desencadenador de Lambda es una máquina de estado que controla la ruta que sigue el usuario a través de los desafíos.

  • El desencadenador de Lambda CreateAuthChallenge toma el nombre de un desafío como entrada y genera el desafío y los parámetros para evaluar la respuesta. Cuando DefineAuthChallenge devuelve CUSTOM_CHALLENGE como el siguiente desafío, el flujo de autenticación llama a CreateAuthChallenge. El desencadenador de Lambda CreateAuthChallenge supera el siguiente tipo de desafío del parámetro de metadatos del desafío.

  • La función de Lambda VerifyAuthChallengeResponse evalúa la respuesta y devuelve un valor booleano para indicar si la respuesta ha sido válida.

Un flujo de autenticación personalizado también puede utilizar una combinación de desafíos integrados, como la verificación de contraseñas SRP y MFA mediante SMS. Puede usar desafíos personalizados como CAPTCHA o preguntas secretas.

Usar la verificación de contraseña de SRP en el flujo de autenticación personalizado

Si desea incluir SRP en un flujo de autenticación personalizado, debe comenzar con SRP.

  • Para iniciar la verificación por contraseña de SRP en un flujo personalizado, la aplicación llama a InitiateAuth con CUSTOM_AUTH como Authflow. En la asignación de AuthParameters, la solicitud de la aplicación incluye SRP_A: (el valor de SRP A) y CHALLENGE_NAME: SRP_A.

  • El flujo CUSTOM_AUTH invoca el desencadenador de Lambda DefineAuthChallenge con una sesión inicial de challengeName: SRP_A y challengeResult: true. La función de Lambda responder con challengeName: PASSWORD_VERIFIER, issueTokens: false y failAuthentication: false.

  • A continuación, la aplicación debe llamar a RespondToAuthChallenge con challengeName: PASSWORD_VERIFIER y los demás parámetros necesarios para SRP en el mapa challengeResponses.

  • Si Amazon Cognito verifica la contraseña, RespondToAuthChallenge llama al desencadenador de Lambda DefineAuthChallenge con una segunda sesión de challengeName: PASSWORD_VERIFIER y challengeResult: true. En ese momento, el desencadenador de Lambda DefineAuthChallenge responde con challengeName: CUSTOM_CHALLENGE para iniciar el desafío personalizado.

  • Si MFA está habilitado para un usuario, una vez que Amazon Cognito verifique la contraseña, se le pide al usuario que configure o inicie sesión con MFA.

nota

La página web de inicio de sesión alojada de Amazon Cognito no puede activar Desencadenadores de Lambda de desafío de autenticación personalizado.

Para obtener más información sobre los desencadenadores de Lambda, incluido el código de muestra, consulte Personalización de flujos de trabajo de grupos de usuarios con desencadenadores de Lambda.

Flujo de autenticación de administrador

La práctica recomendada para la autenticación consiste en utilizar las operaciones de la API descritas en Flujo de autenticación personalizado con SRP para la verificación de contraseñas. Los AWS SDK utilizan ese enfoque, y este enfoque les ayuda a utilizar SRP. Sin embargo, si desea evitar los cálculos de SRP, hay disponible un conjunto alternativo de operaciones de la API de administrador que se usa en servidores backend seguros. Para estas implementaciones de administrador de backend, utilice AdminInitiateAuth en lugar de InitiateAuth. También utilice AdminRespondToAuthChallenge en lugar de RespondToAuthChallenge. Dado que puede enviar la contraseña como texto sin formato, no tiene que realizar cálculos de SRP al utilizar estas operaciones. A continuación se muestra un ejemplo:

AdminInitiateAuth Request { "AuthFlow":"ADMIN_USER_PASSWORD_AUTH", "AuthParameters":{ "USERNAME":"<username>", "PASSWORD":"<password>" }, "ClientId":"<clientId>", "UserPoolId":"<userPoolId>" }

Estas operaciones de autenticación de administrador requieren credenciales de desarrollador y el uso del proceso de firma de AWS Signature Version 4 (SigV4). Estas operaciones están disponibles en los SDK estándar de AWS , que incluyen Node.js, lo que es de gran utilidad para las funciones de Lambda. Para utilizar estas operaciones y hacer que acepten contraseñas como texto sin formato, debe activarlas para la aplicación en la consola. Alternativamente, puede pasar ADMIN_USER_PASSWORD_AUTH en el parámetro ExplicitAuthFlow en llamadas a CreateUserPoolClient o UpdateUserPoolClient. Las operaciones InitiateAuth y RespondToAuthChallenge no aceptan ADMIN_USER_PASSWORD_AUTH y AuthFlow.

En la respuesta AdminInitiateAuth de ChallengeParameters, el atributo USER_ID_FOR_SRP, si existe, contiene el verdadero nombre de usuario y no el alias del usuario (como la dirección de correo electrónico o un número de teléfono). En la llamada a AdminRespondToAuthChallenge, en ChallengeResponses, debe pasar este nombre de usuario en el parámetro USERNAME.

nota

Dado que las implementaciones de administrador de backend usan el flujo de autenticación de administrador, el flujo no admite el seguimiento de dispositivos. Si el seguimiento de dispositivos está activado, la autenticación de administrador se realiza correctamente, pero las llamadas de actualización del token de acceso fallan.

Flujo de autenticación de migración de usuarios

Un desencadenador de Lambda para la migración de usuarios ayuda a migrar usuarios desde un sistema de administración de usuarios heredado a un grupo de usuarios. Si elige el flujo de autenticación USER_PASSWORD_AUTH, no es necesario que los usuarios restablezcan sus contraseñas durante la migración de usuarios. Durante la autenticación, este flujo envía las contraseñas de los usuarios al servicio a través de una conexión SSL cifrada.

Cuando haya migrado todos los usuarios, cambie los flujos al flujo SRP más seguro. El flujo SRP no envía ninguna contraseña a través de la red.

Para obtener más información sobre los desencadenadores de Lambda, consulte Personalización de flujos de trabajo de grupos de usuarios con desencadenadores de Lambda.

Para obtener más información acerca de la migración de usuarios con un desencadenador de Lambda, consulte Importación de usuarios a grupos de usuarios con un desencadenador de Lambda para la migración de usuarios.