遷移使用者 Lambda 觸發程序 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

遷移使用者 Lambda 觸發程序

當使用者使用密碼登入時或在忘記密碼流程時,該使用者不存在於使用者集區中,Amazon Cognito 會叫用此觸發程序。Lambda 函數成功傳回後,Amazon Cognito 會在使用者集區中建立使用者。如需使用使用者遷移 Lambda 觸發程序進行身分驗證流程的詳細資訊,請參閱透過使用者遷移 Lambda 觸發程序匯入使用者

若要在登入時將使用者從現有使用者目錄遷移至 Amazon Cognito 使用者集區,或在忘記密碼流程時使用此 Lambda 觸發程序。

遷移使用者 Lambda 觸發程序來源

triggerSource 值 事件
UserMigration_Authentication 登入時的使用者遷移。
UserMigration_ForgotPassword 忘記密碼流程時的使用者遷移。

遷移使用者 Lambda 觸發程序參數

Amazon Cognito 傳遞至此 Lambda 函數的請求,是以下參數和 Amazon Cognito 新增至所有請求的常用參數之組合。

JSON
{ "userName": "string", "request": { "password": "string", "validationData": { "string": "string", . . . }, "clientMetadata": { "string": "string", . . . } }, "response": { "userAttributes": { "string": "string", . . . }, "finalUserStatus": "string", "messageAction": "string", "desiredDeliveryMediums": [ "string", . . .], "forceAliasCreation": boolean, "enableSMSMFA": boolean } }

遷移使用者請求參數

userName

使用者在登入時輸入的使用者名稱。

密碼

使用者在登入時輸入的密碼。Amazon Cognito 不會在由忘記密碼流程啟動的請求中傳送此值。

validationData

一或多個鍵值組,包含使用者登入請求中的驗證資料。若要將此資料傳遞至 Lambda 函數,您可以在 InitiateAuthAdminInitiateAuthAPI動作中使用 ClientMetadata 參數。

clientMetadata

您可以做為 Lambda 函數的自訂輸入提供的一個或多個鍵值組,該函數用於遷移使用者觸發程序。若要將此資料傳遞至 Lambda 函數,您可以在 AdminRespondToAuthChallengeForgotPasswordAPI動作中使用 ClientMetadata 參數。

遷移使用者回應參數

userAttributes

此欄位為必填。

此欄位必須包含一或多個 Amazon Cognito 存放在您使用者集區中的使用者描述檔中並作為使用者屬性使用的名稱值組。您可以同時包含標準和自訂使用者屬性。自訂屬性需要 custom: 字首以便與標準屬性區分。如需詳細資訊,請參閱自訂屬性

注意

若要在忘記密碼流程中重設密碼,使用者必須擁有經驗證的電子郵件地址或經驗證的電話號碼。Amazon Cognito 會將包含重設密碼代碼的訊息,傳送至使用者屬性中的電子郵件地址或電話號碼。

屬性 需求
在您建立使用者集區時標記為必要的任何屬性 如果在遷移期間遺失任何必要屬性,Amazon Cognito 將會使用預設值。
username

如果您已經使用登入使用者名稱以外的別名屬性來設定您的使用者集區,且使用者已輸入有效的別名值作為使用者名稱,則此為必填項。此別名值可以是電子郵件地址、偏好的使用者名稱或電話號碼。

如果請求和使用者集區符合別名要求,則函數的回應必須將收到的 username 參數指派給別名屬性。此外,回應必須將您自己的值指派給 username 屬性。如果您的使用者集區不符合將接收的 username 映射至別名所需要的條件,則回應中的 username 參數必須與請求完全匹配,或省略。

注意

username 在使用者集區中必須是唯一的。

finalUserStatus

您可以將此參數設定為 CONFIRMED 以自動確認您的使用者,如此一來使用者即可使用先前的密碼登入。當您將使用者設定為 CONFIRMED,使用者無需進行額外的動作就能登入。如果您沒有將此屬性設定為 CONFIRMED,它被設定為 RESET_REQUIRED

RESET_REQUIREDfinalUserStatus 意味著使用者在登入時必須於遷移後立即變更密碼,並且您的用户端應用程式必須在身分驗證流程中處理 PasswordResetRequiredException

注意

Amazon Cognito 不會強制執行您在使用 Lambda 觸發程序進行遷移期間為使用者集區設定的密碼強度政策。如果密碼不符合您設定的密碼政策,Amazon Cognito 仍會接受密碼,以便繼續遷移使用者。若要強制執行密碼強度政策,並拒絕不符合政策的密碼,請驗證程式碼中的密碼強度。然後,如果密碼不符合政策,請將 finalUserStatus 設定為 RESET_REQUIRED

messageAction

您可以將此參數設定為 SUPPRESS 以拒絕傳送 Amazon Cognito 通常會向新使用者傳送的歡迎訊息。如果您的函數未傳回此參數,Amazon Cognito 會傳送歡迎訊息。

desiredDeliveryMediums

您可以將此參數設定為 EMAIL,以透過電子郵件傳送歡迎訊息,或設定為 SMS傳送歡迎訊息SMS。如果您的函數未傳回此參數,Amazon Cognito 會透過 傳送歡迎訊息SMS。

forceAliasCreation

如果您將此參數設定為 ,TRUE且 UserAttributes 參數中的電話號碼或電子郵件地址已存在為具有不同使用者的別名,則API通話會將別名從先前使用者遷移至新建立的使用者。先前的使用者將無法再使用該別名登入。

如果您將此參數設定為 FALSE,而且別名已存在,Amazon Cognito 不會遷移使用者,並且會將錯誤傳回用户端應用程式。

如果您未傳回此參數,Amazon Cognito 會假定其值為「false」。

啟用SMSMFA

將此參數設定為 ,true要求遷移的使用者完成SMS文字訊息多重要素身分驗證 (MFA) 以登入。您的使用者集區必須MFA已啟用。請求參數中的用戶屬性必須包含電話號碼,否則該用戶的遷移將失敗。

範例:搭配現有密碼來遷移使用者

此範例 Lambda 函數會使用現有密碼遷移使用者,並避免歡迎訊息從 Amazon Cognito 中出現。

Node.js
const validUsers = { belladonna: { password: "Test123", emailAddress: "bella@example.com" }, }; // Replace this mock with a call to a real authentication service. const authenticateUser = (username, password) => { if (validUsers[username] && validUsers[username].password === password) { return validUsers[username]; } return null; }; const lookupUser = (username) => { const user = validUsers[username]; if (user) { return { emailAddress: user.emailAddress }; } return null; }; const handler = async (event) => { if (event.triggerSource === "UserMigration_Authentication") { // Authenticate the user with your existing user directory service const user = authenticateUser(event.userName, event.request.password); if (user) { event.response.userAttributes = { email: user.emailAddress, email_verified: "true", }; event.response.finalUserStatus = "CONFIRMED"; event.response.messageAction = "SUPPRESS"; } } else if (event.triggerSource === "UserMigration_ForgotPassword") { // Look up the user in your existing user directory service const user = lookupUser(event.userName); if (user) { event.response.userAttributes = { email: user.emailAddress, // Required to enable password-reset code to be sent to user email_verified: "true", }; event.response.messageAction = "SUPPRESS"; } } return event; }; export { handler };