利用用户迁移 Lambda 触发器将用户导入用户池
通过这种方法,用户在首次使用启用了全新 Amazon Cognito 的应用程序时,可在首次登录或忘记密码过程中从现有用户目录无缝迁移到用户池。这种迁移由用户迁移 Lambda 函数实现,需要您在用户池中进行配置。有关此 Lambda 触发器的详细信息(包括请求和响应参数)以及示例代码,请参阅迁移用户 Lambda 触发器参数。
在开始用户迁移过程之前,请首先在您的Amazon账户中创建用户迁移 Lambda 函数,然后将您的用户池配置为使用此 Lambda 函数的 ARN 作为用户迁移触发器。为您的 Lambda 函数添加授权策略,只允许 Amazon Cognito 服务账户委托人(“cognito-idp.amazonaws.com”)和您用户池的 SourceARN 调用它,以防止任何其他Amazon客户的用户池调用您的 Lambda 函数。有关更多信息,请参阅对 Amazon Lambda 使用基于资源的策略(Lambda 函数策略)。
登录过程中的步骤
-
用户打开您的应用程序,使用 Amazon Mobile SDK
中的 Cognito 身份提供商 API,通过应用程序中的原生登录 UI 屏幕进行登录;或使用 Amazon Cognito 提供的托管登录 UI(通过 Amazon Cognito Auth SDK 的使用)进行登录。 -
您的应用程序将用户名和密码发送至 Amazon Cognito。如果您的应用程序具有原生登录 UI,并使用 Cognito 身份提供商开发工具包,那么您的应用程序必须使用 USER_PASSWORD_AUTH 流程,开发工具包通过该流程将密码发送至服务器 (您的应用程序不得使用默认 USER_SRP_AUTH 流程,因为在 SRP 身份验证流程中,开发工具包不会将密码发送到服务器)。将 AuthenticationDetails.authenticationType 设置为 "USER_PASSWORD",即可启用 USER_PASSWORD_AUTH 流程。
-
Amazon Cognito 会检查用户名是否存在于用户池中,包括作为别名的用户电子邮件、电话号码或 preferred_username。如果用户不存在,Amazon Cognito 会调用您的用户迁移 Lambda 函数(其参数包括用户名和密码)。有关详细信息,请参阅迁移用户 Lambda 触发器参数。
-
您的用户迁移 Lambda 函数应调用您现有的登录服务,利用您的现有用户目录或用户数据库对用户进行身份验证,还应返回用户属性,存储在用户池的用户配置文件中。如果您希望用户继续使用现有密码,请在 Lambda 响应中将属性
finalUserStatus
设置为“CONFIRMED”。有关响应的必要属性,请参阅 迁移用户 Lambda 触发器参数。重要 请勿在您的用户迁移 Lambda 代码中记录整个请求事件对象(因为这样会将密码包含在发送到 CloudWatch Logs 的日志记录中),并确保您会清理日志,以便不会记录密码。
-
Amazon Cognito 在您的用户池中创建用户配置文件,并将令牌返回您的应用程序客户端。
-
您的应用程序客户端现在可以继续执行登录后的正常功能。
用户迁移完毕后,我们建议您的原生移动应用程序使用 USER_SRP_AUTH
流程进行登录。它使用安全远程密码 (SRP) 协议对用户进行身份验证,不会通过网络发送密码,还能通过迁移过程中所用的 USER_PASSWORD_AUTH
流程提供安全优势。
如果在迁移期间出现错误(包括客户端设备问题或网络问题),您的应用程序会收到 Amazon Cognito API 的错误响应,可能会在用户池中创建用户账户,也可能不会。用户应尝试再次登录,如果反复失败,则尝试在您的应用程序中使用忘记密码流程重置密码。
忘记密码流程的工作原理是类似的,但不会向您的用户迁移 Lambda 函数提供密码,函数只会在现有用户目录中查找用户,并返回属性,存储在用户池中。然后,Amazon Cognito 会通过电子邮件或 SMS 向用户发送重置密码代码,用户即可在您的应用程序中设置新密码。如果您的应用程序有原生 UI,它需要提供忘记密码流程的屏幕。如果您的应用程序使用 Amazon Cognito 托管 UI,我们会提供 UI 屏幕。