Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

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

通过这种方法,用户在首次使用启用了全新 Amazon Cognito 的应用程序时,可在首次登录或忘记密码过程中从现有用户目录无缝迁移到用户池。这种迁移由用户迁移 Lambda 函数实现,需要您在用户池中进行配置。有关此 Lambda 触发器的详细信息 (包括请求和响应参数) 以及示例代码,请参阅 迁移用户 Lambda 触发器参数

在开始用户迁移过程之前,请首先在您的 AWS 账户中创建用户迁移 Lambda 函数,然后配置您的用户池,使用此 Lambda 函数的 ARN 作为用户迁移触发器。为您的 Lambda 函数添加授权策略,只允许 Amazon Cognito 服务账户委托人 ("cognito-idp.amazonaws.com") 和您的用户池的源 ARN 调用它,以防止任何其他 AWS 客户的用户池调用您的 Lambda 函数。有关更多信息,请参阅对 AWS Lambda 使用基于资源的策略 (Lambda 函数策略)

登录过程中的步骤

  1. 用户打开您的应用程序,使用 AWS 移动开发工具包中的 Cognito 身份提供商 API,通过应用程序中的原生登录 UI 屏幕进行登录;或使用 Amazon Cognito 提供的托管登录 UI (使用 Amazon Cognito 身份验证开发工具包 加以利用) 进行登录。

  2. 您的应用程序将用户名和密码发送至 Amazon Cognito。如果您的应用程序具有原生登录 UI,并使用 Cognito 身份提供商开发工具包,那么您的应用程序必须使用 USER_PASSWORD_AUTH 流程,开发工具包通过该流程将密码发送至服务器 (您的应用程序不得使用默认 USER_SRP_AUTH 流程,因为在 SRP 身份验证流程中,开发工具包不会将密码发送到服务器)。将 AuthenticationDetails.authenticationType 设置为 "USER_PASSWORD",即可启用 USER_PASSWORD_AUTH 流程。

  3. Amazon Cognito 会检查用户名是否存在于用户池中,包括作为别名的用户电子邮件、电话号码或 preferred_username。如果用户不存在,Amazon Cognito 会调用您的用户迁移 Lambda 函数 (其参数包括用户名和密码)。有关详细信息,请参阅 迁移用户 Lambda 触发器参数

  4. 您的用户迁移 Lambda 函数应调用现有的登录服务,利用您的现有用户目录或用户数据库对用户进行身份验证,还应返回用户属性,存储在用户池的用户配置文件中。如果您希望用户继续使用现有密码,请在 Lambda 响应中将属性 finalUserStatus 设置为 "CONFIRMED"。有关响应的必要属性,请参阅 迁移用户 Lambda 触发器参数

    重要

    请勿在您的用户迁移 Lambda 代码中记录整个请求事件对象 (因为这样会把密码包含在发送到 CloudWatch 日志的日志记录中),并确保您会清理日志,以便密码不会被记录。

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

  6. 您的应用程序客户端现在可以继续执行登录后的正常功能。

用户迁移完毕后,我们建议您的原生移动应用程序使用 USER_SRP_AUTH 流程进行登录。它使用安全远程密码 (SRP) 协议对用户进行身份验证,不会通过网络发送密码,还能通过迁移过程中所用的 USER_PASSWORD_AUTH 流程提供安全优势。

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

忘记密码流程的工作原理是类似的,但不会向您的用户迁移 Lambda 函数提供密码,函数只会在现有用户目录中查找用户,并返回属性,存储在用户池中。然后,Amazon Cognito 会通过电子邮件或 SMS 向用户发送重置密码代码,用户即可在您的应用程序中设置新密码。如果您的应用程序有原生 UI,它需要提供忘记密码流程的屏幕。如果您的应用程序使用 Amazon Cognito 托管 UI,我们会提供 UI 屏幕。