

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 利用用户迁移 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)。

在开始迁移用户之前，请在您的 Amazon Web Services 账户中创建一个用户迁移 Lambda 函数，并将该 Lambda 函数设置为您的用户池中的用户迁移触发器。向您的 Lambda 函数添加授权策略，该策略仅允许 Amazon Cognito 服务账户主体 `cognito-idp.amazonaws.com` 调用该 Lambda 函数，并且只能在您自己的用户池的上下文中进行。有关更多信息，请参阅[对 Amazon Lambda 使用基于资源的策略（Lambda 函数策略）](https://docs.amazonaws.cn/lambda/latest/dg/access-control-resource-based.html)。

**登录流程**

1. 用户打开您的应用程序并使用 Amazon Cognito 用户池 API 或通过托管登录进行登录。有关如何简化使用 Amazon Cogn APIs ito 登录的更多信息，请参阅。[将 Amazon Cognito 身份验证和授权与 Web 和移动应用程序集成](cognito-integrate-apps.md)

1. 您的应用程序将用户名和密码发送至 Amazon Cognito。如果您的应用程序具有使用 Amazon SDK 构建的自定义登录界面，则您的应用程序必须使用[InitiateAuth](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)或[AdminInitiateAuth](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)与`USER_PASSWORD_AUTH`或`ADMIN_USER_PASSWORD_AUTH`流程。当您的应用使用其中一个流程时，开发工具包会将密码发送到服务器。
**注意**  
在添加用户迁移触发器之前，请在您的应用程序客户端的设置中激活 `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 日志中。

1. Amazon Cognito 在您的用户池中创建用户配置文件，并将令牌返回您的应用程序客户端。

1. 您的应用程序执行令牌接收，接受用户身份验证，然后继续处理请求的内容。

迁移用户后，请使用 `USER_SRP_AUTH` 进行登录。安全远程密码 (SRP) 协议不会通过网络发送密码，并为您在迁移期间使用的 `USER_PASSWORD_AUTH` 流程提供安全优势。

如果迁移期间出现错误（包括客户端设备或网络问题），您的应用程序会从 Amazon Cognito 用户池 API 接收错误响应。发生这种情况时，Amazon Cognito 可能会也可能不会在您的用户池中创建用户账户。然后，用户应尝试再次登录。如果登录反复失败，请尝试在您的应用程序中使用忘记密码流程重置用户密码。

忘记密码流程还会使用 `UserMigration_ForgotPassword` 事件源调用您的 [迁移用户 Lambda 触发器](user-pool-lambda-migrate-user.md) 函数。由于用户在请求密码重置时没有提交密码，因此 Amazon Cognito 在发送到您的 Lambda 函数的事件中不包含密码。您的函数只能在现有用户目录中查找用户并返回属性，以添加到用户池中的用户配置文件中。在您的函数完成其调用并将其响应返回给 Amazon Cognito 后，您的用户池将通过电子邮件或 SMS 发送密码重置代码。在您的应用程序中，提示您的用户输入确认码和新密码，然后[ConfirmForgotPassword](https://docs.amazonaws.cn/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html)通过 API 请求将该信息发送给 Amazon Cognito。您还可以在托管登录中使用内置的忘记密码流程页面。

**其他资源**
+ [将用户迁移到 Amazon Cognito 用户池的方法](https://www.amazonaws.cn/blogs/security/approaches-for-migrating-users-to-amazon-cognito-user-pools/)