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

8 minuti di lettura
0

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

    **Attenzione:**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.

  2. Crea un archivio di file.zip, noto anche come file index.js compresso:

    $ zip function.zip index.js
  3. Apri la console Lambda.

  4. Crea una funzione Lambda con un runtime Node.js.
    Di seguito è riportato un esempio di comando dell'Interfaccia della linea di comando (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 REGION

    Nota: Sostituisci ExecutionRoleARN con il nome della risorsa Amazon (ARN) del ruolo AWS Identity and Access Management (IAM) 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 la REGIONE con la tua regione AWS.

  5. Installa il modulo @aws-crypto/client-node e base64-js per utilizzare l'SDK di crittografia AWS.
    Se non hai installato il modulo @aws-crypto/client-node, procedi come segue. 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
    
    $ npm install base64-js

    Nota: per lo sviluppo di risorse Lambda, è consigliabile utilizzare un ambiente Amazon Linux 2. 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 livello 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 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 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 la REGIONE con la tua regione AWS.

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. Usa il seguente comando per creare una chiave AWS KMS:

    $ aws kms create-key --description "KMS Key for CustomEmailSender" --region REGION

    Nota: sostituisci REGIONE 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 REGION

    Nota: Sostituisci Keyid con il valore dell'ID chiave dall'output del comando create-key. Sostituisci REGIONE 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 REGION

    Nota: Sostituisci CustomEmailSender con il nome della tua funzione Lambda. Sostituisci l'alias/custom-email-key con l'alias chiave per la tua chiave AWS KMS. Sostituisci key\ _ARN con il valore ARN dall'output del comando create-key. Sostituisci REGIONE con il codice della tua regione.

  2. Concedi al responsabile del servizio Amazon Cognito l'autorizzazione cognito-idp.amazonaws.com per richiamare la funzione Lambda. Usa il seguente comando per concedere l'autorizzazione all'entità del servizio Amazon Cognito che richiama 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 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 REGIONE con il codice della tua regione.

  3. Aggiorna il pool di utenti Amazon Cognito in modo che utilizzi un trigger Lambda per mittente e-mail personalizzato. Imposta 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, consulta 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 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 REGIONE 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.
Installa il modulo @aws-crypto/client-node e base64-js per utilizzare l'SDK di crittografia AWS.

AWS UFFICIALE
AWS UFFICIALEAggiornata 9 mesi fa