

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

# 透過使用者遷移 Lambda 觸發程序匯入使用者
<a name="cognito-user-pools-import-using-lambda"></a>

有了此方法，當使用者首次使用您的應用程式登入或請求重設密碼時，您可以將使用者從現有使用者目錄無縫遷移至使用者集區。新增 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 功能到您的使用者集區，便會接收有關嘗試登入的使用者其相關中繼資料，並從外部身分來源傳回使用者描述檔資訊。如需此 Lambda 觸發程序範例程式碼的詳細資訊，包括請求和回應參數，請參閱[遷移使用者 Lambda 觸發程序參數](user-pool-lambda-migrate-user.md#cognito-user-pools-lambda-trigger-syntax-user-migration)。

開始遷移使用者前，請在您的 AWS 帳戶帳戶中建立使用者遷移 Lambda 函數，並將 Lambda 函數設定為使用者集區中的使用者遷移觸發程序。向您的 Lambda 函數新增授權政策，該政策僅允許 Amazon Cognito 服務帳戶主體 `cognito-idp.amazonaws.com` 叫用 Lambda 函數，且僅在您自己的使用者集區內容中。如需詳細資訊，請參閱[針對 AWS Lambda 使用以資源為基礎的政策 (Lambda 函數政策)](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

**登入程序**

1. 使用者會開啟您的應用程式，並使用 Amazon Cognito 使用者集區 API 或透過受管登入來登入。如需有關如何使用 Amazon Cognito API 簡化登入的詳細資訊，請參閱 [將 Amazon Cognito 身分驗證和授權與 Web 和行動應用程式整合](cognito-integrate-apps.md)。

1. 您的應用程式會將使用者名稱與密碼傳送到 Amazon Cognito。如果您的應用程式具有您使用 AWS SDK 建置的自訂登入 UI，您的應用程式必須搭配 或 `ADMIN_USER_PASSWORD_AUTH`流程使用 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) `USER_PASSWORD_AUTH`或 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)。當您的應用程式使用這些流程之一時，開發套件會將密碼發送到伺服器。
**注意**  
在您新增使用者遷移觸發程序之前，請先啟用您應用程式用戶端設定中的 `USER_PASSWORD_AUTH` 或 `ADMIN_USER_PASSWORD_AUTH`。您必須使用這些流程，而不是預設的 `USER_SRP_AUTH` 流程。Amazon Cognito 必須向您的 Lambda 函數傳送密碼，以便它能夠驗證您的使用者在其他目錄中的身分驗證。SRP 會從您的 Lambda 函數中隱藏您使用者的密碼。

1. Amazon Cognito 會檢查提交的使用者名稱是否與使用者集區中的使用者名稱或別名相符。您可以將使用者的電子郵件地址、電話號碼或偏好的使用者名稱設定為使用者集區中的別名。如果使用者不存在，Amazon Cognito 會將包含使用者名稱和密碼的參數傳送到您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數。

1. 您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數會使用現有的使用者目錄或使用者資料庫，來檢查使用者或驗證其身分。該函數會傳回 Amazon Cognito 存放在使用者集區中使用者描述檔的使用者屬性。只有在已提交的使用者名稱符合別名屬性時，您才能傳回 `username` 參數。如果您想要使用者繼續使用現有的密碼，您的函數會將 Lambda 回應中的屬性 `finalUserStatus` 設定為 `CONFIRMED`。您的應用程式必須傳回在 [遷移使用者 Lambda 觸發程序參數](user-pool-lambda-migrate-user.md#cognito-user-pools-lambda-trigger-syntax-user-migration) 顯示的所有`"response"` 參數。
**重要**  
請勿在使用者遷移 Lambda 程式碼中記錄整個請求事件物件。此請求事件物件包含使用者的密碼。如果您未清理日誌，密碼會出現在 CloudWatch Logs 中。

1. Amazon Cognito 在您的使用者集區中建立使用者描述檔，並將字符傳回到您的應用程式用戶端。

1. 您的應用程式會執行權杖擷取、接受使用者身分驗證，並繼續處理請求的內容。

遷移使用者後，請使用 `USER_SRP_AUTH` 登入。安全遠端密碼 (SRP) 通訊協定不會透過網路傳送密碼，但會提供您在遷移期間所使用 `USER_PASSWORD_AUTH` 流程的安全優勢。

遷移期間如果發生錯誤，包括用戶端裝置或網路問題，您的應用程式會收到來自 Amazon Cognito 使用者集區 API 的錯誤回應。發生這種情況時，Amazon Cognito 可能會或不會在您的使用者集區中建立使用者帳戶。然後，使用者應嘗試再次登入。如果重複發生登入失敗，請嘗試使用您應用程式的忘記密碼流程重設使用者密碼。

忘記密碼流程還會叫用您的 [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) 函數與 `UserMigration_ForgotPassword` 事件來源。由於使用者在請求重設密碼時未提交密碼，因此 Amazon Cognito 在傳送給 Lambda 函數的事件中不會包含密碼。您的函數只能查閱在現有使用者目錄中的使用者，並傳回屬性以新增至使用者集區中的使用者描述檔。在您的函數完成其調用並將回應傳回 Amazon Cognito 之後，您的使用者集區就會透過電子郵件或簡訊傳送密碼重設代碼。在您的應用程式中，提示使用者輸入確認碼和新密碼，然後在 [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) API 請求中將該資訊傳送至 Amazon Cognito。您也可以將內建頁面用於受管登入中的忘記密碼流程。

**其他資源**
+ [將使用者遷移至 Amazon Cognito 使用者集區的方法](https://aws.amazon.com/blogs/security/approaches-for-migrating-users-to-amazon-cognito-user-pools/)