

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 para remitentes personalizados
<a name="user-pool-lambda-custom-sender-triggers"></a>

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 gestionada por el AWS KMS cliente y el. AWS Encryption SDK AWS Encryption SDK Se trata de una biblioteca de cifrado del lado del cliente que le ayuda a cifrar y descifrar datos genéricos.

**[CustomEmailSender](user-pool-lambda-custom-email-sender.md)**  
Amazon Cognito invoca este desencadenador para enviar notificaciones por correo electrónico a los usuarios. 

**[PersonalizadaSMSSender](user-pool-lambda-custom-sms-sender.md)**  
Amazon Cognito invoca este desencadenador para enviar notificaciones por SMS a los usuarios.

## Conceptos sobre el cifrado
<a name="user-pool-lambda-custom-sender-triggers-resources"></a>

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 gestionado para crear y controlar claves. AWS KMS Estas claves cifran los datos. Para obtener más información, consulte [¿Qué es AWS Key Management Service?](/kms/latest/developerguide/overview.html).

**Clave de 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](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys).

**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 usar una clave KMS simétrica, debe llamar 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](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks). 

## Conceptos importantes sobre los desencadenadores de Lambda Remitente personalizado
<a name="user-pool-lambda-custom-sender-triggers-things-to-know"></a>
+ 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 muestra en el siguiente ejemplo de AWS CLI, incluya entradas para todas las funciones de Lambda que desee añadir o conservar 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](cognito-user-pool-updating.md).

  ```
      #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 activador Lambda de remitente personalizado con un `update-user-pool` AWS CLI comando, omita el `CustomEmailSender` parámetro `CustomSMSSender` o e incluya todos los demás activadores que desee usar con su grupo de usuarios. `--lambda-config`

  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 name="enable-custom-sender-lambda-trigger"></a>

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](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks) 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](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html). A continuación, puede utilizar AWS Encryption SDK la función Lambda para descifrar los secretos y enviarlos al usuario en texto plano.

1. 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": "*"
       }]
   }
   ```

------

1. Cree una función de Lambda para el desencadenador de remitente personalizado. Amazon Cognito utiliza el [SDK de cifrado de AWS](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) 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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) que tenga, como mínimo, permisos `kms:Decrypt` para su clave KMS.

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

   1. Añada el AWS Encryption SDK a su función Lambda. Para obtener más información, consulte [Lenguajes de programación del SDK de cifrado de AWS](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html). 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.

      1. Abra la función y añada la AWS Encryption SDK. Para obtener más información y enlaces de descarga, consulte [Lenguajes de programación de AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/programming-languages.html) en la *Guía para desarrolladores de AWS Encryption SDK *.

      1. 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](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-create) en la *Guía para desarrolladores de AWS Lambda *.

1. 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 AWS CLI comando otorga permiso a Amazon Cognito para invocar la función Lambda:

   ```
   aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
   ```

1. Genere una solicitud de [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)API con un `LambdaConfig` parámetro que añada activadores Lambda de remitente personalizados. 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).

# Desencadenador de Lambda para remitentes de correos electrónicos personalizados
<a name="user-pool-lambda-custom-email-sender"></a>

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 activador de remitente personalizado, tu AWS Lambda función puede enviar notificaciones por correo electrónico a tus usuarios a través del método y el proveedor que elijas. 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](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger).

## Fuentes del desencadenador de Lambda para remitentes de correos electrónicos personalizados
<a name="trigger-source"></a>

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` | Event | 
| --- | --- | 
| CustomEmailSender\$1SignUp | Un usuario se registra y Amazon Cognito envía un mensaje de bienvenida. | 
| CustomEmailSender\$1Authentication | Un usuario inicia sesión y Amazon Cognito envía un código de MFA o OTP por correo electrónico. | 
| CustomEmailSender\$1ForgotPassword | Un usuario solicita un código para restablecer su contraseña. | 
| CustomEmailSender\$1ResendCode | Un usuario solicita un código de sustitución de confirmación de cuenta. | 
| CustomEmailSender\$1UpdateUserAttribute | 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\$1VerifyUserAttribute | 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\$1AdminCreateUser | Crea un nuevo usuario en su grupo de usuarios y Amazon Cognito le envía una contraseña temporal. | 
| CustomEmailSender\$1AccountTakeOverNotification | Amazon Cognito detecta un intento de asumir 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
<a name="custom-email-sender-parameters"></a>

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](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "request": {
        "type": "customEmailSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### Parámetros de solicitudes de remitente de correo electrónico personalizado
<a name="custom-email-sender-request-parameters"></a>

**type**  
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. Para pasar estos datos a la función Lambda, puede usar el ClientMetadata parámetro en las acciones [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)y de la [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. Amazon Cognito no incluye datos del ClientMetadata parámetro ni de las operaciones de [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API en la solicitud que transfiere a la función de autenticación posterior. [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)  
Amazon Cognito envía `ClientMetadata` a 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 `ClientMetadata` en eventos de desencadenador con el origen `CustomEmailSender_AccountTakeOverNotification`.

**userAttributes**  
Uno o varios pares clave-valor que representan atributos de usuario.

### Parámetros de respuesta de remitente de correo electrónico personalizado
<a name="custom-email-sender-response-parameters"></a>

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
<a name="custom-email-sender-code-examples"></a>

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

1. Instale la última versión de NodeJS en el espacio de trabajo de desarrollador.

1. Cree un nuevo proyecto de NodeJS en su espacio de trabajo.

1. Inicialice el proyecto con `npm init -y`.

1. Cree el script para la función de Lambda: `touch index.mjs`.

1. Pegue el contenido del siguiente ejemplo en `index.mjs`.

1. Descargue la dependencia del proyecto, AWS Encryption SDK:`npm install @aws-crypto/client-node`.

1. Comprima el directorio del proyecto en un archivo: `zip -r my_deployment_package.zip .`.

1. [Implemente el archivo ZIP en su función](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html).

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;
    }
};
```

# Desencadenador de Lambda para remitentes personalizados de SMS
<a name="user-pool-lambda-custom-sms-sender"></a>

Al asignar un desencadenador de envío de SMS 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 SMS. Con un activador de remitente personalizado, tu AWS Lambda función puede enviar notificaciones por SMS a tus usuarios a través del método y el proveedor que elijas. El código personalizado de la función debe procesar y entregar todos los mensajes SMS 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 SMS. Su función Lambda puede personalizar la llamada a las operaciones de la API de Amazon SNS, por ejemplo, cuando quiere gestionar varios IDs orígenes o cruces. 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](user-pool-lambda-custom-sender-triggers.md#enable-custom-sender-lambda-trigger).

## Fuentes del desencadenador de Lambda para remitentes personalizados de SMS
<a name="trigger-source"></a>

En la siguiente tabla, se muestra el evento desencadenante de las fuentes del desencadenador de SMS personalizado en el código de Lambda.


| `TriggerSource value` | Event | 
| --- | --- | 
| CustomSMSSender\$1SignUp | Un usuario se registra y Amazon Cognito envía un mensaje de bienvenida. | 
| CustomSMSSender\$1ForgotPassword | Un usuario solicita un código para restablecer su contraseña. | 
| CustomSMSSender\$1ResendCode | Un usuario solicita un código nuevo para confirmar su registro. | 
| CustomSMSSender\$1VerifyUserAttribute | 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. | 
| CustomSMSSender\$1UpdateUserAttribute | 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. | 
| CustomSMSSender\$1Authentication | Un usuario inicia sesión y Amazon Cognito envía un código de MFA o OTP por SMS. | 
| CustomSMSSender\$1AdminCreateUser | Crea un nuevo usuario en su grupo de usuarios y Amazon Cognito le envía una contraseña temporal. | 

## Parámetros de desencadenador de Lambda para remitente de SMS personalizado
<a name="custom-sms-sender-parameters"></a>

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](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que Amazon Cognito agrega a todas las solicitudes.

------
#### [ JSON ]

```
{
    "request": {
        "type": "customSMSSenderRequestV1",
        "code": "string",
        "clientMetadata": {
            "string": "string",
             . . .
            },
        "userAttributes": {
            "string": "string",
            . . .
         }
}
```

------

### Parámetros de solicitudes de remitente de SMS personalizado
<a name="custom-sms-sender-request-parameters"></a>

**type**  
La versión de la solicitud. Para un evento de remitente de SMS personalizado, el valor de esta cadena es siempre `customSMSSenderRequestV1`.

**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 SMS personalizado. Para pasar estos datos a la función Lambda, puede usar el ClientMetadata parámetro en las acciones [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)y de la [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. Amazon Cognito no incluye datos del ClientMetadata parámetro ni de las operaciones de la [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API en la solicitud que transfiere a la función de autenticación posterior. [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)

**userAttributes**  
Uno o varios pares clave-valor que representan atributos de usuario.

### Parámetros de respuesta de remitente de SMS personalizado
<a name="custom-sms-sender-response-parameters"></a>

Amazon Cognito no espera ninguna información de devolución adicional en la respuesta. La función puede utilizar operaciones de la API para consultar y modificar los recursos o registrar metadatos de eventos en un sistema externo.

## Ejemplo de código
<a name="custom-sms-sender-code-examples"></a>

En el siguiente ejemplo de Node.js se procesa un evento de mensaje SMS en la función de Lambda de remitente de SMS 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**

1. Instale la última versión de NodeJS en el espacio de trabajo de desarrollador.

1. Cree un nuevo proyecto de NodeJS en su espacio de trabajo.

1. Inicialice el proyecto con `npm init -y`.

1. Cree el script para la función de Lambda: `touch index.mjs`.

1. Pegue el contenido del siguiente ejemplo en `index.mjs`.

1. Descargue la dependencia del proyecto, AWS Encryption SDK:`npm install @aws-crypto/client-node`.

1. Comprima el directorio del proyecto en un archivo: `zip -r my_deployment_package.zip .`.

1. [Implemente el archivo ZIP en su función](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html).

```
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 SMS.
// This example logs message details to CloudWatch Logs from your Lambda function.
// Update this function with custom logic that sends an SMS message to 'phoneNumber' with body 'message'.
const sendSMS = async (phoneNumber, message) => {
    // Log the destination with the phone number masked.
    console.log(`Simulating SMS send to ${phoneNumber.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('SMS 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 == 'CustomSMSSender_SignUp') {
            const phoneNumber = event.request.userAttributes.phone_number;
            const message = `Welcome! Your verification code is: ${plainTextCode}`;
            await sendSMS(phoneNumber, message);
        }
        else if (event.triggerSource == 'CustomSMSSender_ResendCode') {
            // Handle resend code
        }
        else if (event.triggerSource == 'CustomSMSSender_ForgotPassword') {
            // Handle forgot password
        }
        else if (event.triggerSource == 'CustomSMSSender_UpdateUserAttribute') {
            // Handle update attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_VerifyUserAttribute') {
            // Handle verify attribute
        }
        else if (event.triggerSource == 'CustomSMSSender_AdminCreateUser') {
            // Handle admin create user
        }
        return;
    } catch (error) {
        console.error('Error in custom SMS sender:', error);
        throw error;
    }
};
```

**Topics**
+ [Fuentes del desencadenador de Lambda para remitentes personalizados de SMS](#trigger-source)
+ [Parámetros de desencadenador de Lambda para remitente de SMS personalizado](#custom-sms-sender-parameters)
+ [Ejemplo de código](#custom-sms-sender-code-examples)
+ [Evaluar las capacidades de los mensajes SMS con una función de remitente de SMS personalizado](#sms-to-email-example)

## Evaluar las capacidades de los mensajes SMS con una función de remitente de SMS personalizado
<a name="sms-to-email-example"></a>

La función Lambda de remitente de SMS personalizado acepta los mensajes SMS que enviaría el grupo de usuarios y la función entrega el contenido según su lógica personalizada. Amazon Cognito envía el [Parámetros de desencadenador de Lambda para remitente de SMS personalizado](#custom-sms-sender-parameters) a su función. Su función puede hacer lo que desee con esta información. Por ejemplo, puede enviar el código a un tema de Amazon Simple Notification Service (Amazon SNS). Un suscriptor de temas de Amazon SNS puede ser un mensaje SMS, un punto de conexión HTTPS o una dirección de correo electrónico.

[Para crear un entorno de prueba para la mensajería SMS de Amazon Cognito con una función Lambda de remitente de SMS personalizada, consulte [amazon-cognito-user-pool- development-and-testing-with - sms-redirected-to-email](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email) en la biblioteca aws-samples de. GitHub](https://github.com/aws-samples) El repositorio contiene AWS CloudFormation plantillas que pueden crear un nuevo grupo de usuarios o funcionar con un grupo de usuarios del que ya disponga. Estas plantillas crean funciones de Lambda y un tema de Amazon SNS. La función de Lambda que la plantilla asigna como desencadenador de remitente SMS personalizado, redirige los mensajes SMS a los suscriptores al tema de Amazon SNS. 

Cuando implementa esta solución en un grupo de usuarios, todos los mensajes que Amazon Cognito suele enviar a través de mensajería SMS, la función de Lambda los envía en su lugar a una dirección de correo electrónico central. Utilice esta solución para personalizar y obtener una vista previa de los mensajes SMS y para probar los eventos del grupo de usuarios que hacen que Amazon Cognito envíe un mensaje SMS. Tras completar las pruebas, revierta la CloudFormation pila o elimine la asignación de funciones de envío de SMS personalizada de su grupo de usuarios.

**importante**  
No utilice las plantillas de [amazon-cognito-user-pool- development-and-testing-with - sms-redirected-to-email](https://github.com/aws-samples/amazon-cognito-user-pool-development-and-testing-with-sms-redirected-to-email) para crear un entorno de producción. La función de Lambda del remitente de SMS personalizado en la solución *simula* mensajes SMS, pero la función de Lambda los envía a una sola dirección de correo electrónico central. Para poder enviar mensajes SMS en un grupo de usuarios de Amazon Cognito de producción, debe completar los requisitos que se muestran en [Configuración de mensajes SMS para grupos de usuarios de Amazon Cognito](user-pool-sms-settings.md).