Come si utilizza il trigger Lambda del mittente di posta elettronica personalizzato nei pool di utenti Amazon Cognito?

8 minuti di lettura
0

Devo richiamare il trigger AWS Lambda del mittente di posta elettronica personalizzato Amazon Cognito per elaborare e recapitare i messaggi di posta elettronica.

Risoluzione

Utilizza un trigger di invio e-mail personalizzato di Amazon Cognito per consentire ai provider di terze parti di inviare notifiche e-mail ai tuoi utenti dal tuo codice di funzione Lambda. Amazon Cognito invia richieste di messaggi e-mail a una funzione Lambda. Quindi, la funzione Lambda elabora e consegna i messaggi di posta elettronica.

Crea una funzione Lambda che funga da trigger personalizzato per il mittente delle email

  1. Crea un file con il nome index.js, aggiungi il codice seguente al file e salva le modifiche.
const AWS = require('aws-sdk');
const b64 = require('base64-js');
const encryptionSdk = require('@aws-crypto/client-node');

// Configure the encryption SDK client with the KMS key from the environment variables.

const { encrypt, decrypt } = encryptionSdk.buildClient(encryptionSdk.CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
const generatorKeyId = process.env.KEY_ALIAS;
const keyIds = [ process.env.KEY_ARN ];
const keyring = new encryptionSdk.KmsKeyringNode({ generatorKeyId, keyIds })
exports.handler = async (event) => {

// Decrypt the secret code using encryption SDK.
let plainTextCode;
if(event.request.code){
const { plaintext, messageHeader } = await decrypt(keyring, b64.toByteArray(event.request.code));
plainTextCode = plaintext
}

// PlainTextCode now has the decrypted secret.

if(event.triggerSource == 'CustomEmailSender_SignUp'){

// Send email to end-user using custom or 3rd party provider.
// Include temporary password in the email.

console.log("CustomEmailSender_SignUp: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_ResendCode'){
console.log("CustomEmailSender_ResendCode: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_ForgotPassword'){
console.log("CustomEmailSender_ForgotPassword: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_UpdateUserAttribute'){
console.log("CustomEmailSender_UpdateUserAttribute: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_VerifyUserAttribute'){
console.log("CustomEmailSender_VerifyUserAttribute: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_AdminCreateUser'){
console.log("CustomEmailSender_AdminCreateUser: " + plainTextCode);

}else if(event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification'){
console.log("CustomEmailSender_AccountTakeOverNotification: " + plainTextCode);
}

return;
};

Avvertenza:Questo codice è stato creato per decrittografare i segreti crittografati. I segreti sono password e codici di autorizzazione temporanei inviati da Amazon Cognito. Lo script stampa anche il codice in chiaro nei log a scopo dimostrativo. Tuttavia, la registrazione dei segreti in testo normale è un problema di sicurezza. Quando l'applicazione è in produzione, NON stampare MAI segreti decifrati nei log.

Aggiungi il codice pertinente nel file index.js per inviare messaggi di posta elettronica agli utenti dal tuo provider di posta elettronica personalizzato.

  1. Crea un archivio di file.zip, noto anche come file index.js compresso:
$ zip function.zip index.js
  1. Apri la consolle Lambda.

  2. Crea una funzione Lambda con un runtime Node.js.

Di seguito è riportato un esempio di comando AWS Command Line Interface (AWS CLI) per creare una funzione Lambda con il runtime Node.js 14.x.

**Nota:**Se ricevi errori durante l'esecuzione dei comandi dell'interfaccia a riga di comando di AWS, assicurati di utilizzare la versione più recente dell'interfaccia a riga di comando di AWS.

$ aws lambda create-function --function-name CustomEmailSender --runtime nodejs14.x --handler index.handler --zip-file fileb://function.zip --role <ExecutionRoleARN> --region <specify a region>

Nota:Sostituisci<ExecutionRoleARN>con il ruolo AWS Identity and Access Management (IAM) Amazon Resource Name (ARN) che desideri associare alla funzione Lambda. Per maggiori dettagli, consulta Ruolo di esecuzione Lambda. Puoi sostituire CustomEmailSender con il nome della funzione di tua scelta. Sostituisci**<specify a region>**con il codice della tua Regione AWS.

  1. Installa il** modulo** @aws -crypto/client-node per utilizzare l'SDK di crittografia AWS.

Se non hai installato il** modulo** @aws -crypto/client-node, devi completare le seguenti attività di alto livello:

  • Installa il modulo.
  • Crea un package della versione più recente del modulo.
  • Crea un layer Lambda che contenga la dipendenza che puoi usare con la funzione Lambda.

**Nota:**Esegui i comandi di installazione in un ambiente di sviluppo locale compatibile con Lambda.

Crea una cartella di lavoro:

$ mkdir -p aws-crypto-layer/nodejs

Cambia la cartella di lavoro:

$ cd aws-crypto-layer/nodejs

Installa l'ultima versione del modulo** aws-crypto** con il gestore di package npm:

$ npm install @aws-crypto/client-node

Nota:È consigliabile utilizzare un ambiente Amazon Linux 2 per lo sviluppo di risorse Lambda. Usa Docker per installare il modulo aws-crypto quando sviluppi con un sistema operativo Windows o macOS:

$ docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/nodejs:14" /bin/sh -c "npm install @aws-crypto/client-node; exit"

Crea un file.zip da caricare sul tuo layer Lambda:

$ zip -r ../package.zip ../

Crea un layer Lambda che includa l'ultima versione del modulo @aws -crypto/client-node:

$ aws lambda publish-layer-version --layer-name node_crypto --description "My layer" --license-info "MIT" --compatible-runtimes nodejs14.x --zip-file fileb://../package.zip --region <specify a region>

Aggiungi il layer Lambda alla tua funzione:

$ aws lambda update-function-configuration --function-name CustomEmailSender --layers arn:aws:lambda:us-east-2:123456789012:layer:node_crypto:1 --region <specify a region>

Nota:Sostituisci CustomEmailSender con il nome della tua funzione. Sostituisci** arn:aws:lambda:us-east- 2:123456789012:layer:node\ _crypto:1** con il valore** layerVersionARN** dall'output del comando publish-layer-version. Sostituisci**<specify a region>**con il codice della tua Regione.

Crea una chiave di crittografia in AWS KMS

Amazon Cognito utilizza una chiave di crittografia simmetrica AWS Key Management Service (AWS KMS) per crittografare le password temporanee e i codici di autorizzazione generati da Amazon Cognito.

  1. Crea una chiave AWS KMS:
$ aws kms create-key --description "KMS Key for CustomEmailSender" --region <specify a region>

**Nota:Sostituisci<specify a region>**con il codice della tua Regione.

Poiché questo comando non specifica una policy chiave, viene assegnata la policy chiave predefinita. Per applicare una policy chiave personalizzata alla tua chiave AWS KMS, aggiungi il** parametro**\ --policy al comando con la tua policy JSON. Assicurati di concedere a KMS:CreateGrant l'autorizzazione all'entità IAM che esegue l'operazione UpdateUserPool per aggiungere un trigger e-mail personalizzato.

Non è possibile specificare un alias quando si esegue il comando create-key. Per creare un alias per la nuova chiave KMS, usa il comando create-alias:

$ aws kms create-alias --alias-name alias/custom-email-key --target-key-id <KeyId> --region <specify a region>

**Nota:Sostituisci<KeyId>con il valore dell'ID chiave dall'output del comando create-key. Sostituisci<specify a region>**con il codice della tua Regione.

L'esempio di codice si basa sulle variabili di ambiente** KEY\ _ALIAS** e** KEY\ _ARN** per le informazioni sulla chiave di crittografia. È necessario configurare queste variabili di ambiente nel trigger Lambda CustomEmailSender.

$ aws lambda update-function-configuration --function-name CustomEmailSender --environment 'Variables={KEY_ALIAS=alias/custom-email-key,KEY_ARN=<key_ARN>}' --region <specify a region>

Nota:Sostituisci CustomEmailSender con il nome della tua funzione Lambda. Sostituisci l'alias/chiave e-mail personalizzata con l'alias chiave per la tua chiave AWS KMS. Sostituisci** <key\ _ARN>** con il valore ARN dall'output del comando create-key. Sostituisci**<specify a region>**con il codice della tua Regione.

Concedi al responsabile del servizio Amazon Cognito l'autorizzazione cognito-idp.amazonaws.com per richiamare la funzione Lambda

Utilizza il seguente comando per concedere l'autorizzazione al responsabile del servizio Amazon Cognito per richiamare la funzione Lambda:

$ aws lambda add-permission --function-name CustomEmailSender --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com --source-arn <UserPoolArn> --region <specify a region>

Nota:Sostituisci CustomEmailSender con il nome della tua funzione Lambda. Sostituisci**<UserPoolArn>con il tuo pool di utenti ARN. Per trovare l'ARN del pool di utenti, apri la pagina Pool di utenti della console Amazon Cognito. Quindi, seleziona il pool di utenti dall'elenco. Oppure, esegui il comando describe-user-pool. Sostituisci<specify a region>**con il codice della tua Regione.

Aggiorna il pool di utenti di Amazon Cognito in modo che utilizzi un trigger Lambda personalizzato per i mittenti di posta elettronica

Aggiorna il pool di utenti impostando il parametro CustomEmailSender nell'API ** UpdateUserPool**. UpdateUserPool richiede tutti i parametri esistenti del pool di utenti e i parametri che si desidera modificare. Amazon Cognito imposta i valori di tutti i parametri mancanti ai valori predefiniti. Per ulteriori informazioni, vedere Aggiornamento della configurazione del pool di utenti.

Nell'esempio seguente, solo il parametro**\ --lambda-config** viene utilizzato con i dettagli della funzione Lambda ** CustomEmailSender**. Pertanto, il comando aggiunge il trigger personalizzato del mittente dell'e-mail al pool di utenti e imposta i parametri del pool di utenti rimanenti come predefiniti. Se configuri il pool di utenti con valori non predefiniti, passa i valori nel comando update-user-pool per evitare di impostarli sui valori predefiniti.

$ aws cognito-idp update-user-pool --lambda-config "CustomEmailSender={LambdaVersion=V1_0,LambdaArn= <LambdaArn>},KMSKeyID=<KMSKeyArn>" --user-pool-id <UserPoolId> --region <specify a region>

**Nota:Sostituisci<LambdaArn>con il valore ARN della funzione dall'output del comando create-function. Sostituisci<KMSKeyArn>con il valore ARN fornito nell'output del comando create-key. Sostituisci<UserPoolId>con l'ID del tuo pool di utenti Amazon Cognito. Sostituisci<specify a region>**con il codice della tua Regione.

Verifica la funzionalità

Per testare l'integrazione della funzione Lambda, simula un'operazione di invio e-mail per un utente del tuo pool di utenti, ad esempio la verifica dell'e-mail o il recupero della password. L'esempio seguente mostra un evento ForgotPassword inviato alla funzione Lambda da Amazon Cognito.

{
  version: '1',
  triggerSource: 'CustomEmailSender_ForgotPassword',
  region: 'us-east-1',
  userPoolId: 'us-east-1_xxxxxxxx',
  userName: 'example_user',
  callerContext: {
    awsSdkVersion: 'aws-sdk-unknown-unknown',
    clientId: '12a3b4example-clientid'
  },
  request: {
    type: 'customEmailSenderRequestV1',
    code: 'XXXXeBlI7XP3RQmipedVF+7OGa4AgQACABVhdXXXXXXXvLXB1YmxpYy1rZXkAREF6Zk9NR2lBR0FUeDRITStmRHl4RDJyNlpqa2wvWktBbG45ckRmTEpMZ1A3THp4ME9RaVVjVHl3MVFOSEZjS3piZz09AAt1c2VycG9vbC1pZAATdXMtZWFzdC0xX29DOUhnUHVKWgABAAdhd3Mta21zAEthcm46XXdzOmttczp1cy1lYXN0LTE6XXX3XXc0NDA5OXXzOmtleS8yNmQ0ZjVmMy00YmZhLTQ0OXXtODUxZS01ZTM2ZWIwYjhmYjMAuAECAQB42Am0o+Rx0MgG+wLLyKtm1/vTm03JK3jQBZxqABAkreYBMOoAUtm3mLS7+kb2VL0SHgAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHjPPHlSWPt+UKrQOQIBEIA7oFUeGe2NPX2cuEVi+Qxwp8/IH1bgyYQut+QbbkElc1rXXXXXbeEVMjMkFQmQufmJyag9v1f+PUalvXwXAAAAAAwAABAAAAAAAAAAAAAAAAAAscZHg8dY/cKTskGQc065mv////8AAAABAAAAAAAAAAAAAAABAAAABpofXaVnP4pmf+yMoCElrOGy7Gn8pIUAZzBlAjEAn/7tuTNko8/HCwXXXXlCOJDeU0SSyB7o9y0TXHM7GptdvmB1JL9OzLxmUg6zChIhAjAFFbH4NrSblvwh/m0inDc11BpeOSKghtg8Pg5Nkf8eY6vmXX6GxjaCuyhBSO7IDcM=',
    clientMetadata: null,
    userAttributes: {
      sub: '1a2b3cde-33cd-402f-5g67-examplesub',
      'cognito:user_status': 'CONFIRMED',
      email_verified: 'true',
      email: 'user@example.com'
    }
  }
}

L'esempio seguente è una risposta in codice in chiaro:

CustomEmailSender_ForgotPassword: 12345

Puoi visualizzare i log completi nel gruppo di log di Amazon CloudWatch creato per la tua funzione Lambda. Per ulteriori dettagli su come visualizzare questi log, consulta Accesso ai log di Amazon CloudWatch per AWS Lambda.

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa