Desencadenador de Lambda para remitentes de correos electrónicos personalizados
Al asignar un desencadenador de envío de correo electrónico personalizado al grupo de usuarios, Amazon Cognito invoca una función de Lambda en lugar de su comportamiento predeterminado cuando un evento de usuario requiere que envíe un mensaje de correo electrónico. Con un desencadenador de remitente personalizado, la función de AWS Lambda puede enviar notificaciones por correo electrónico a los usuarios a través del método y el proveedor que elija. El código personalizado de la función debe procesar y entregar todos los mensajes de correo electrónico del grupo de usuarios.
Este desencadenador es útil en los casos en que quiera tener más control sobre la forma en que el grupo de usuarios envía mensajes de correo electrónico. Su función de Lambda puede personalizar la llamada a las operaciones de API de Amazon SES, como, por ejemplo, cuando quiera administrar varias identidades verificadas o entre Regiones de AWS. La función también podría redirigir los mensajes a otro medio de entrega o a un servicio de terceros.
Para obtener información sobre cómo configurar un desencadenador de remitente de correo electrónico personalizado, consulte Activación de desencadenadores de Lambda Remitente personalizado.
Fuentes del desencadenador de Lambda para remitentes de correos electrónicos personalizados
En la siguiente tabla se muestra el evento desencadenante de las fuentes del desencadenador para correos electrónicos personalizados en el código de Lambda.
TriggerSource value |
Evento |
|---|---|
CustomEmailSender_SignUp |
Un usuario se registra y Amazon Cognito envía un mensaje de bienvenida. |
CustomEmailSender_Authentication |
Un usuario inicia sesión y Amazon Cognito envía un código de MFA o OTP por correo electrónico. |
CustomEmailSender_ForgotPassword |
Un usuario solicita un código para restablecer su contraseña. |
CustomEmailSender_ResendCode |
Un usuario solicita un código de sustitución de confirmación de cuenta. |
CustomEmailSender_UpdateUserAttribute |
Un usuario actualiza una dirección de correo electrónico o un atributo de número de teléfono y Amazon Cognito envía un código para verificar el atributo. |
CustomEmailSender_VerifyUserAttribute |
Un usuario crea una dirección de correo electrónico nueva o un atributo de número de teléfono y Amazon Cognito envía un código para verificar el atributo. |
CustomEmailSender_AdminCreateUser |
Crea un nuevo usuario en su grupo de usuarios y Amazon Cognito le envía una contraseña temporal. |
CustomEmailSender_AccountTakeOverNotification |
Amazon Cognito detecta un intento de hacerse cargo de una cuenta de usuario y envía una notificación al usuario. |
Parámetros de desencadenador de Lambda para remitente de correo electrónico personalizado
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.
Parámetros de solicitudes de remitente de correo electrónico personalizado
- tipo
-
La versión de la solicitud. Para un evento de remitente de correo electrónico personalizado, el valor de esta cadena es siempre
customEmailSenderRequestV1. - code
-
El código cifrado que su función puede descifrar y enviar al usuario.
- clientMetadata
-
Uno o varios pares clave-valor que puede proporcionar como datos de entrada personalizados al desencadenador de la función de Lambda de remitente de correo electrónico personalizado. Puede transferir estos datos a la función de Lambda mediante el parámetro ClientMetadata en las acciones de la API AdminRespondToAuthChallenge y RespondToAuthChallenge. Amazon Cognito no incluye los datos transferidos del parámetro ClientMetadata en las operaciones de la API AdminInitiateAuth y InitiateAuth en la solicitud que transfiere a la función de autenticación posterior.
nota
Amazon Cognito envía
ClientMetadataa funciones de desencadenador de correo electrónico personalizadas en eventos con los siguientes orígenes de activación:-
CustomEmailSender_ForgotPassword -
CustomEmailSender_SignUp -
CustomEmailSender_Authentication
Amazon Cognito no envía
ClientMetadataen eventos de desencadenador con el origenCustomEmailSender_AccountTakeOverNotification. -
- userAttributes
-
Uno o varios pares clave-valor que representan atributos de usuario.
Parámetros de respuesta de remitente de correo electrónico personalizado
Amazon Cognito no espera ninguna información de devolución adicional en la respuesta de remitente de correo electrónico personalizado. La función de Lambda debe interpretar el evento, descifrar el código y, a continuación, entregar el contenido del mensaje. Una función típica agrupa un mensaje de correo electrónico y lo dirige a un relé de SMTP de terceros.
Ejemplo de código
En el siguiente ejemplo de Node.js se procesa un evento de mensaje de correo electrónico en la función de Lambda de remitentes de correo electrónico personalizado. En este ejemplo se supone que la función tiene dos variables de entorno definidas.
KEY_ID-
El ID de la clave de KMS que desea utilizar para cifrar y descifrar los códigos de sus usuarios.
KEY_ARN-
El nombre de recurso de Amazon (ARN) de la clave de KMS que desea utilizar para cifrar y descifrar los códigos de sus usuarios.
Cómo implementar esta función
-
Instale la última versión de NodeJS en el espacio de trabajo de desarrollador.
-
Cree un nuevo proyecto de NodeJS en su espacio de trabajo.
-
Inicialice el proyecto con
npm init -y. -
Cree el script para la función de Lambda:
touch index.mjs. -
Pegue el contenido del siguiente ejemplo en
index.mjs. -
Descargue la dependencia del proyecto, AWS Encryption SDK:
npm install @aws-crypto/client-node. -
Comprima el directorio del proyecto en un archivo:
zip -r my_deployment_package.zip ..
Esta función de ejemplo descifra el código y, para los eventos de registro, simula el envío de un mensaje de correo electrónico a la dirección de correo electrónico del usuario.
import { KmsKeyringNode, buildClient, CommitmentPolicy } from '@aws-crypto/client-node'; // Configure the encryption SDK client with the KMS key from the environment variables const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT ); const generatorKeyId = process.env.KEY_ID; const keyIds = [process.env.KEY_ARN]; const keyring = new KmsKeyringNode({ generatorKeyId, keyIds }); // Example function to simulate sending email. // This example logs message details to CloudWatch Logs from your Lambda function. // Update this function with custom logic that sends an email message to 'emailaddress' with body 'message'. const sendEmail = async (emailAddress, message) => { // Log the destination with the email address masked. console.log(`Simulating email send to ${emailAddress.replace(/[^@.]/g, '*')}`); // Log the message with the code masked. console.log(`Message content: ${message.replace(/\b\d{6,8}\b/g, '********')}`); // Simulate API delay await new Promise(resolve => setTimeout(resolve, 100)); console.log('Email sent successfully'); return true; }; export const handler = async (event) => { try { // Decrypt the secret code using encryption SDK let plainTextCode; if (event.request.code) { const { plaintext, messageHeader } = await decrypt(keyring, Buffer.from(event.request.code, 'base64')); plainTextCode = Buffer.from(plaintext).toString('utf-8'); } // Handle different trigger sources if (event.triggerSource == 'CustomEmailSender_SignUp') { const emailAddress = event.request.userAttributes.email; const message = `Welcome! Your verification code is: ${plainTextCode}`; await sendEmail(emailAddress, message); } else if (event.triggerSource == 'CustomEmailSender_ResendCode') { // Handle resend code } else if (event.triggerSource == 'CustomEmailSender_ForgotPassword') { // Handle forgot password } else if (event.triggerSource == 'CustomEmailSender_UpdateUserAttribute') { // Handle update attribute } else if (event.triggerSource == 'CustomEmailSender_VerifyUserAttribute') { // Handle verify attribute } else if (event.triggerSource == 'CustomEmailSender_AdminCreateUser') { // Handle admin create user } else if (event.triggerSource == 'CustomEmailSender_Authentication') { // Handle authentication } else if (event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification') { // Handle account takeover notification } return; } catch (error) { console.error('Error in custom email sender:', error); throw error; } };