Wie verwende ich den Lambda-Trigger für den benutzerdefinierten E-Mail-Absender in Amazon Cognito-Benutzerpools?

Lesedauer: 7 Minute
0

Ich muss den AWS Lambda-Trigger für den benutzerdefinierten E-Mail-Absender von Amazon Cognito aufrufen, um E-Mail-Nachrichten zu verarbeiten und zuzustellen.

Auflösung

Verwenden Sie einen benutzerdefinierten E-Mail-Absender-Trigger von Amazon Cognito, damit Drittanbieter E-Mail-Benachrichtigungen von Ihrem Lambda-Funktionscode aus an Ihre Benutzer senden können. Amazon Cognito sendet E-Mail-Nachrichtenanfragen an eine Lambda-Funktion. Anschließend verarbeitet und versendet die Lambda-Funktion die E-Mail-Nachrichten.

Erstellen Sie eine Lambda-Funktion als Ihren benutzerdefinierten E-Mail-Absender-Trigger

1.    Erstellen Sie eine Datei mit dem Namen index.js, fügen Sie der Datei den folgenden Code hinzu und speichern Sie dann Ihre Änderungen.

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

Warnung: Dieser Code ist so programmiert, dass er verschlüsselte Geheimnisse entschlüsselt. Die Geheimnisse sind temporäre Passwörter und Autorisierungscodes, die von Amazon Cognito gesendet werden. Das Skript druckt zu Demonstrationszwecken auch den Klartext-Code in Protokollen. Das Protokollieren von Geheimnissen im Klartext ist jedoch ein Sicherheitsproblem. Wenn Ihre Anwendung in Produktion ist,drucken Sie NIEMALS entschlüsselte Geheimnisse in Protokollen aus.

Fügen Sie den entsprechenden Code in die Datei index.js ein, um E-Mail-Nachrichten von Ihrem benutzerdefinierten E-Mail-Anbieter an Benutzer zu senden.

2.    Erstellen Sie ein ZIP-Dateiarchiv, auch bekannt als komprimierte Datei index.js:

$ zip function.zip index.js

3.    Öffnen Sie die Lambda-Konsole.

4.     Erstellen Sie eine Lambda-Funktion mit einer Laufzeitumgebung von Node.js.

Im Folgenden finden Sie ein Beispiel für einen AWS Command Line Interface (AWS CLI)-Befehl zum Erstellen einer Lambda-Funktion mit der 14.x-Laufzeit von Node.js.

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste Version der AWS-CLI verwenden.

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

Hinweis: Ersetzen Sie**<ExecutionRoleARN>** mit der AWS Identity and Access Management (IAM)-Rolle Amazon Resource Name (ARN), die Sie der Lambda-Funktion zuordnen möchten. Weitere Informationen finden Sie unter Lambda-Ausführungsrolle. Sie können CustomEmailSender durch den Funktionsnamen Ihrer Wahl ersetzen. Ersetzen Sie**<specify a region>** mit Ihrem AWS-Region-Code.

5.    Installieren Sie das Modul @aws -crypto/client-node, um das AWS Encryption SDK zu verwenden.

Wenn Sie das Modul @aws -crypto/client-node nicht installiert haben, müssen Sie die folgenden allgemeinen Aufgaben ausführen:

  • Installieren Sie das Modul.
  • Verpacken Sie die neueste Version des Moduls.
  • Erstellen Sie einen Lambda-Layer, der die Abhängigkeit enthält, die Sie mit der Lambda-Funktion verwenden können.

Hinweis: Führen Sie die Installationsbefehle in einer lokalen Entwicklungsumgebung aus, die mit Lambda kompatibel ist.

Erstellen Sie ein Arbeitsverzeichnis:

$ mkdir -p aws-crypto-layer/nodejs

Ändern Sie das Arbeitsverzeichnis:

$ cd aws-crypto-layer/nodejs

Installieren Sie die neueste Version des aws-crypto-Moduls mit dem npm-Paketmanager:

$ npm install @aws-crypto/client-node

Hinweis: Es ist eine bewährte Methode, bei der Entwicklung von Lambda-Ressourcen eine Amazon Linux 2-Umgebung zu verwenden. Verwenden Sie Docker, um das aws-crypto-Modul zu installieren, wenn Sie mit einem Windows- oder MacOS-Betriebssystem entwickeln:

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

Erstellen Sie eine ZIP-Datei, um sie auf Ihren Lambda-Layer hochzuladen:

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

Erstellen Sie einen Lambda-Layer, der die neueste Version des @aws-crypto/client-node-Moduls enthält:

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

Fügen Sie die Lambda-Ebene zu Ihrer Funktion hinzu:

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

Hinweis:Ersetzen Sie CustomEmailSender durch den Namen Ihrer Funktion. Ersetzen Sie arn:aws:lambda:us-east-2:123456789012:layer:node_crypto:1 durch den Wert layerVersionArn aus der Befehlsausgabe publish-layer-version. Ersetzen Sie<specify a region> mit Ihrem Region-Code.

Erstellen Sie einen Verschlüsselungsschlüssel in AWS KMS

Amazon Cognito verwendet einen symmetrischen Verschlüsselungsschlüssel von AWS Key Management Service (AWS KMS), um temporäre Passwörter und Autorisierungscodes zu verschlüsseln, die von Amazon Cognito generiert wurden.

1.    Erstellen Sie einen AWS KMS-Schlüssel:

$ aws kms create-key --description "KMS Key for CustomEmailSender" --region <specify a region>

Hinweis: Ersetzen Sie**<specify a region>** mit Ihrem Region-Code.

Da dieser Befehl keine Schlüsselrichtlinie angibt,wird die Standardschlüsselrichtlinie zugewiesen. Um eine angepasste Schlüsselrichtlinie auf Ihren AWS KMS-Schlüssel anzuwenden, fügen Sie dem Befehl mit Ihrer JSON Richtlinie den Parameter --policy hinzu. Stellen Sie sicher, dass Sie der IAM-Entität, die die UpdateUserPool-Operation ausführt, die Berechtigung kms:CreateGrant erteilen, um einen benutzerdefinierten E-Mail-Trigger hinzuzufügen.

Sie können keinen Alias angeben, wenn Sie den Befehl create-key ausführen. Verwenden Sie den Befehl create-alias, um einen Alias für den neuen KMS-Schlüssel zu erstellen:

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

Hinweis: Ersetzen Sie**<KeyId>** mit dem Schlüssel-ID-Wert aus der Befehlsausgabe create-key. Ersetzen Sie**<specify a region>** mit Ihrem Region-Code.

Das Codebeispiel verwendet die Umgebungsvariablen KEY_ALIAS und KEY_ARN für Informationen zum Verschlüsselungsschlüssel. Sie müssen diese Umgebungsvariablen im CustomEmailSender Lambda-Trigger konfigurieren.

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

Hinweis: Ersetzen Sie CustomEmailSender durch Ihren Lambda-Funktionsnamen. Ersetzen Sie alias/custom-email-key durch den Schlüsselalias für Ihren AWS KMS-Schlüssel. Ersetzen Sie <key\ _ARN> durch den ARN-Wert aus der Create-Key-Befehlsausgabe. Ersetzen Sie**<specify a region>** mit Ihrem Region-Code.

Erteilen Sie dem Amazon Cognito-Dienstprinzipal die Berechtigung cognito-idp.amazonaws.com, die Lambda-Funktion aufzurufen

Verwenden Sie den folgenden Befehl, um dem Amazon Cognito-Service Principal die Erlaubnis zum Aufrufen der Lambda-Funktion zu erteilen:

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

Hinweis: Ersetzen Sie CustomEmailSender durch Ihren Lambda-Funktionsnamen. Ersetzen Sie**<UserPoolArn>** mit Ihrem Benutzerpool ARN. Um den Benutzerpool-ARN zu finden, öffnen Sie die Seite des Benutzerpools der Amazon Cognito-Konsole. Wählen Sie dann den Benutzerpool aus der Liste aus. Oder führen Sie den Befehl describe-user-pool aus. Ersetzen Sie**<specify a region>** mit Ihrem Region-Code.

Aktualisieren Sie den Amazon Cognito-Benutzerpool, sodass er einen benutzerdefinierten Lambda-Trigger für E-Mail-Absender verwendet

Aktualisieren Sie den Benutzerpool, indem Sie den CustomEmailSender-Parameter in der UpdateUserPool-API festlegen. UpdateUserPool benötigt alle vorhandenen Parameter Ihres Benutzerpools und die Parameter, die Sie ändern möchten. Amazon Cognito setzt die Werte aller fehlenden Parameter auf ihre Standardwerte. Weitere Informationen finden Sie unter Benutzerpoolkonfiguration aktualisieren.

Im folgenden Beispiel wird nur der Parameter --lambda-config mit CustomEmailSender Lambda-Funktionsdetails verwendet. Der Befehl fügt also den benutzerdefinierten E-Mail-Absender-Trigger zu Ihrem Benutzerpool hinzu und setzt die verbleibenden Benutzerpoolparameter auf die Standardwerte. Wenn Sie Ihren Benutzerpool mit anderen als den Standardwerten konfigurieren, übergeben Sie die Werte im Befehl update-user-pool, um zu vermeiden, dass sie auf die Standardwerte gesetzt werden.

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

Hinweis: Ersetzen Sie**<LambdaArn>** mit dem ARN-Wert der Funktion aus der Befehlsausgabe create-function. Ersetzen Sie**<KMSKeyArn>** mit dem ARN-Wert, der in der Befehlsausgabe create-key angegeben ist. Ersetzen Sie**<UserPoolId>** mit Ihrer Amazon Cognito-Benutzerpool-ID. Ersetzen Sie**<specify a region>** mit Ihrem Region-Code.

Testen Sie die Funktionalität

Um die Integration der Lambda-Funktion zu testen, simulieren Sie einen E-Mail-Absendervorgang für einen Benutzer aus Ihrem Benutzerpool, z. B. die E-Mail-Überprüfung oder die Passwortwiederherstellung. Das folgende Beispiel zeigt ein ForgotPassword-Ereignis, das von Amazon Cognito an die Lambda-Funktion gesendet wurde.

{
  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'
    }
  }
}

Das folgende Beispiel ist eine Antwort im Klartext-Code:

CustomEmailSender_ForgotPassword: 12345

Sie können die vollständigen Protokolle in der Amazon CloudWatch-Protokollgruppe sehen, die für Ihre Lambda-Funktion erstellt wurde. Weitere Informationen zum Anzeigen dieser Protokolle finden Sie unter Zugreifen auf Amazon CloudWatch-Logs für AWS Lambda.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr