Desencadenadores de Lambda para remitentes personalizados - Amazon Cognito

Desencadenadores de Lambda para remitentes personalizados

Los desencadenadores de Lambda CustomEmailSender y CustomSMSSender admiten notificaciones por correo electrónico y SMS de terceros en grupos de usuarios. Puede elegir proveedores de SMS y correo electrónico para que envíen las notificaciones a los usuarios desde su código de función de Lambda. Cuando Amazon Cognito envía a los usuarios invitaciones, códigos de MFA, códigos de confirmación, códigos de verificación y contraseñas temporales, los eventos activan las funciones de Lambda configuradas. Amazon Cognito envía el código y las contraseñas temporales (secretos) a sus funciones de Lambda activadas. Amazon Cognito cifra estos secretos con una clave administrada por el cliente AWS KMS y el AWS Encryption SDK. La AWS Encryption SDK es una biblioteca de cifrado del cliente que le ayuda a cifrar y descifrar datos genéricos.

CustomEmailSender

Amazon Cognito invoca este desencadenador para enviar notificaciones por correo electrónico a los usuarios.

CustomSMSSender

Amazon Cognito invoca este desencadenador para enviar notificaciones por SMS a los usuarios.

Conceptos sobre el cifrado

Amazon Cognito no envía los códigos de los usuarios en texto sin formato en los eventos que envía a desencadenadores de remitentes personalizados. Las funciones de Lambda deben descifrar códigos en los eventos. Los siguientes conceptos forman la arquitectura de cifrado que la función debe utilizar para obtener los códigos que puede entregar a los usuarios.

AWS KMS

AWS KMS es un servicio administrado para crear y controlar claves de AWS KMS. Estas claves cifran los datos. Para obtener más información, consulte ¿Qué es AWS Key Management Service?.

Clave KMS

Una clave KMS es una representación lógica de una clave criptográfica. La clave de KMS incluye metadatos, como el ID de clave, la fecha de creación, la descripción y el estado de la clave. La clave de KMS también contiene el material de claves utilizado para cifrar y descifrar datos. Para obtener más información, consulte AWS claves KMS.

Claves KMS simétricas

Una clave KMS simétrica es una clave de cifrado de 256 bits que no sale de AWS KMS sin cifrar. Para utilizar una clave KMS simétrica, tiene que llamar a AWS KMS. Amazon Cognito utiliza claves simétricas. La misma clave cifra y descifra. Para obtener más información, consulte Claves KMS simétricas.

Conceptos importantes sobre los desencadenadores de Lambda Remitente personalizado

  • Puede utilizar la AWS CLI o el SDK para configurar sus grupos de usuarios con el fin de utilizar estos desencadenadores de Lambda. Estas configuraciones no están disponibles en la consola de Amazon Cognito.

    La operación UpdateUserPool establece la configuración de Lambda. Las solicitudes para esta operación requieren todos los parámetros de su grupo de usuarios y los parámetros que desea cambiar. Si no proporciona todos los parámetros relevantes, Amazon Cognito establece los valores de los parámetros que faltan en sus valores predeterminados. Como se demuestra en el ejemplo de AWS CLI siguiente, incluya entradas para todas las funciones de Lambda que desee agregar o mantener en su grupo de usuarios. Para obtener más información, consulte Actualización de la configuración del grupo de usuarios y del cliente de aplicación.

    #Send this parameter in an 'aws cognito-idp update-user-pool' CLI command, including any existing #user pool configurations. This snippet also includes a pre sign-up trigger for syntax reference. The pre sign-up trigger #doesn't have a role in custom sender triggers. --lambda-config "PreSignUp=lambda-arn, \ CustomSMSSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ CustomEmailSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ KMSKeyID=key-id"

    Para las solicitudes que utilizan el cuerpo JSON de UpdateUserPool, el siguiente fragmento de LambdaConfig asigna funciones personalizadas de envío por SMS y correo electrónico.

    "LambdaConfig": { "KMSKeyID": "arn:aws:kms:us-east-1:111122223333:key/a6c4f8e2-0c45-47db-925f-87854bc9e357", "CustomEmailSender": { "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction", "LambdaVersion": "V1_0" }, "CustomSMSSender": { "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction", "LambdaVersion": "V1_0" }
  • Para eliminar un desencadenador de Lambda de remitente personalizado con un comando update-user-pool de la AWS CLI, omita el parámetro CustomSMSSender o CustomEmailSender de --lambda-config e incluya todos los demás desencadenadores que desee usar con su grupo de usuarios.

    Para eliminar un desencadenador de Lambda de remitente personalizado con una solicitud de API UpdateUserPool, omita el parámetro CustomSMSSender o CustomEmailSender del cuerpo de la solicitud que contiene el resto de la configuración del grupo de usuarios.

  • Amazon Cognito aplica códigos de escape HTML a caracteres reservados como < (&lt;) y > (&gt;) en la contraseña temporal de su usuario. Estos caracteres pueden aparecer en las contraseñas temporales que Amazon Cognito envía a su función de remitente de correo electrónico personalizado, pero no en los códigos de verificación temporales. Para enviar contraseñas temporales, su función de Lambda debe anular los códigos de escape de estos caracteres después de descifrar la contraseña y antes de enviar el mensaje a su usuario.

Activación de desencadenadores de Lambda Remitente personalizado

A fin de utilizar lógica personalizada para enviar mensajes SMS o correos electrónicos a su grupo de usuarios, configure los desencadenadores Remitente personalizado. En el procedimiento siguiente se asigna un desencadenador de SMS personalizado, un desencadenador de correo electrónico personalizado o ambos a su grupo de usuarios. Después de agregar su desencadenador de remitente personalizado, Amazon Cognito siempre envía los atributos de usuario, como el número de teléfono, y el código de un solo uso a su función de Lambda, en lugar del comportamiento predeterminado, que envía un mensaje por correo o SMS.

  1. Cree una clave de cifrado simétrica en AWS Key Management Service (AWS KMS). Amazon Cognito genera secretos (contraseñas temporales, códigos de verificación, contraseñas de autenticación de un solo uso y códigos de confirmación) y, a continuación, utiliza esta clave KMS para cifrar los secretos con AWS Encryption SDK. A continuación, puede descifrar los secretos con AWS Encryption SDK en la función de Lambda para enviarlos al usuario como texto sin formato.

  2. La entidad principal de IAM que crea o actualiza el grupo de usuarios crea una concesión única con la clave de KMS que Amazon Cognito utiliza para cifrar el código. Otorgue estos permisos CreateGrant de entidad principal a su clave de KMS. Para que este ejemplo de política de claves KMS sea efectiva, el administrador que actualice el grupo de usuarios debe iniciar sesión con una sesión de rol asumido para el rol de IAM arn:aws:iam::111222333444:role/my-example-administrator-role.

    Aplique la siguiente política basada en recursos, modificada para su entorno, a su clave KMS.

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/my-example-administrator-role" }, "Action": "kms:CreateGrant", "Resource": "arn:aws:kms:us-west-2:111122223333:key/1example-2222-3333-4444-999example", "Condition": { "StringEquals": { "kms:EncryptionContext:userpool-id": "us-west-2_EXAMPLE" } } }, { "Sid": "Allow Lambda to decrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/my-lambda-function-role" }, "Action": "kms:Decrypt", "Resource": "*" }] }
  3. Cree una función de Lambda para el desencadenador de remitente personalizado. Amazon Cognito utiliza el SDK de cifrado de AWS para cifrar los secretos, las contraseñas temporales y los códigos que autorizan las solicitudes de API de sus usuarios.

    1. Asigne un rol de ejecución de Lambda que tenga, como mínimo, permisos kms:Decrypt para su clave KMS.

    2. Elabore el código de su función de Lambda para enviar sus mensajes. El evento de entrada de su función contiene un secreto. En su función, descifre el secreto con el AWS Encryption SDK y procese los metadatos pertinentes. A continuación, envíe el código, su propio mensaje personalizado y el número de teléfono de destino a la API personalizada que entrega el mensaje.

    3. Agregue el AWS Encryption SDK a su función de Lambda. Para obtener más información, consulte Lenguajes de programación del SDK de cifrado de AWS. Complete los siguientes pasos para actualizar el paquete de Lambda.

      1. Exporte su función de Lambda como un archivo .zip en la Consola de administración de AWS.

      2. Abra la función y agregue el AWS Encryption SDK. Para obtener más información y enlaces de descarga, consulte Lenguajes de programación de AWS Encryption SDK en la Guía para desarrolladores de AWS Encryption SDK.

      3. Comprima su función con sus dependencias del SDK y cargue la función en Lambda. Para obtener más información, consulte Implementación de funciones de Lambda como archivos .zip en la Guía para desarrolladores de AWS Lambda.

  4. Conceda el acceso cognito-idp.amazonaws.com a la entidad principal del servicio de Amazon Cognito para llamar a la función de Lambda.

    El siguiente comando de la AWS CLI concede a Amazon Cognito permiso para invocar su función de Lambda:

    aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
  5. Genere una solicitud de API UpdateUserPool con un parámetro LambdaConfig que añada desencadenadores de Lambda de remitente personalizado. No puede añadir desencadenadores de este tipo en la consola de Amazon Cognito. Los desencadenadores de remitente personalizado requieren parámetros LambdaConfig de KMSKeyID y CustomSMSSender o CustomEmailSender (o ambos).