利用用户迁移 Lambda 触发器将用户导入用户池 - Amazon Cognito

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

利用用户迁移 Lambda 触发器将用户导入用户池

使用这种方法,当用户首次登录您的应用程序或请求重置密码时,您可以将用户从现有用户目录无缝迁移到用户池。向您的用户池添加一个 迁移用户 Lambda 触发器 函数,它会接收有关尝试登录的用户的元数据,并从外部身份源返回用户配置文件信息。有关此 Lambda 触发器的详细信息以及示例代码(包括请求和响应参数),请参阅迁移用户 Lambda 触发器参数

在开始迁移用户之前,请在您的 AWS 账户中创建一个用户迁移 Lambda 函数,并将该 Lambda 函数设置为您的用户池中的用户迁移触发器。向您的 Lambda 函数添加授权策略,该策略仅允许 Amazon Cognito 服务账户主体 cognito-idp.amazonaws.com 调用该 Lambda 函数,并且只能在您自己的用户池的上下文中进行。有关更多信息,请参阅对 AWS Lambda 使用基于资源的策略(Lambda 函数策略)

登录流程

  1. 用户打开您的应用程序并使用 Amazon Cognito 用户池 API 或通过 Amazon Cognito 托管 UI 登录。有关如何使用 Amazon Cognito API 协助登录的更多信息,请参阅将 Amazon Cognito 身份验证和授权与 Web 和移动应用程序集成

  2. 您的应用程序将用户名和密码发送至 Amazon Cognito。如果您的应用程序具有使用 AWS 开发工具包构建的自定义登录 UI,则您的应用程序必须将 InitiateAuthAdminInitiateAuthUSER_PASSWORD_AUTHADMIN_USER_PASSWORD_AUTH 流程一起使用。当您的应用使用其中一个流程时,开发工具包会将密码发送到服务器。

    注意

    在添加用户迁移触发器之前,请在您的应用程序客户端的设置中激活 USER_PASSWORD_AUTHADMIN_USER_PASSWORD_AUTH 流程。您必须使用这些流程而不是默认 USER_SRP_AUTH 流程。Amazon Cognito 必须向您的 Lambda 函数发送密码,以便它可以验证您的用户在另一个目录中的身份验证。SRP 会在您的 Lambda 函数中隐藏您用户的密码。

  3. Amazon Cognito 检查提交的用户名是否与用户池中的用户名或别名匹配。您可以将用户的电子邮件地址、电话号码或首选用户名设置为用户池中的别名。如果用户不存在,Amazon Cognito 会将参数(包括用户名和密码)发送到您的 迁移用户 Lambda 触发器 函数。

  4. 您的 迁移用户 Lambda 触发器 函数使用您的现有用户目录或用户数据库检查用户,或验证用户身份。该函数返回 Amazon Cognito 存储在用户池的用户配置文件中的用户属性。仅当提交的用户名与别名属性匹配时,您才能返回 username 参数。如果您希望用户继续使用其现有密码,您的函数将在 Lambda 响应中将属性 finalUserStatus 设置为 CONFIRMED。您的应用程序必须返回 迁移用户 Lambda 触发器参数 中显示的所有 "response" 参数。

    重要

    不要在您的用户迁移 Lambda 代码中记录整个请求事件对象。此请求事件对象包括用户的密码。如果您不清理日志,密码将显示在 CloudWatch Logs 中。

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

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

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

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

忘记密码流程还会使用 UserMigration_ForgotPassword 事件源调用您的 迁移用户 Lambda 触发器 函数。由于用户在请求密码重置时没有提交密码,因此 Amazon Cognito 在发送到您的 Lambda 函数的事件中不包含密码。您的函数只能在现有用户目录中查找用户并返回属性,以添加到用户池中的用户配置文件中。在您的函数完成其调用并将其响应返回给 Amazon Cognito 后,您的用户群体将通过电子邮件或 SMS 发送密码重置代码。在您的应用程序中,提示您的用户输入确认码和新密码,然后在 ConfirmForgotPassword API 请求中将该信息发送给 Amazon Cognito。您还可以在 Amazon Cognito 托管 UI 中使用内置的忘记密码流程页面。