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

注册并确认用户账户

可通过以下任一方法将用户账户添加到您的用户池中:

自行注册的用户需要获得确认才可登录。导入和创建的用户已经过确认,但他们需要在首次登录时创建密码。以下部分将介绍确认过程以及电子邮件和电话验证。

用户账户确认概述

下图阐明了确认过程:

当用户输入确认代码时,将自动验证电子邮件或电话。

用户账户可以处于以下任一状态:

已注册 (未确认)

用户已成功注册,但在用户账户得到确认之前无法登录。在此状态下,用户已启用,但未得到确认。

自行注册的新用户由此状态开始。

已确认

用户账户已确认,用户可以登录。如果用户输入通过电子邮件或手机 (SMS) 收到的确认代码 (如果是通过电子邮件,则单击确认链接),从而确认了用户账户,则系统将自动验证该电子邮件或电话号码。代码或链接的有效期为 24 小时。

如果管理员或预注册 Lambda 触发器确认了用户账户,则可能没有与账户关联的经验证电子邮件或电话号码。

需要重置密码

用户账户已确认,但用户必须请求代码并重置其密码才可登录。

由管理员或开发人员导入的用户账户以此状态开始。

强制更改密码

用户账户已确认,用户可以使用临时密码进行登录,但在首次登录时,用户必须将其密码更改为新值,然后才能执行其他操作。

由管理员或开发人员创建的用户账户以此状态开始。

Disabled

必须先禁用用户账户才可将其删除。

允许用户自行注册并确认以及验证电子邮件或电话

  1. 用户通过输入用户名称、电话号码和/或电子邮件地址及其他可能属性,在您的应用程序中进行注册。

  2. Amazon Cognito 服务收到来自应用程序的注册请求。验证该请求包含注册所需的所有属性后,该服务将完成注册过程并向用户的手机 (通过 SMS) 或电子邮件发送确认代码。代码的有效期为 24 小时

    注意

    如果用户同时使用电话号码和电子邮件地址注册,且用户池设置需要验证这两个属性,验证代码会通过 SMS 发送到手机上。电子邮件地址未经验证。您的应用程序可以调用 GetUser 以查看电子邮件地址是否在等待验证。如果是,则该应用程序应调用 GetUserAttributeVerificationCode 来启动电子邮件验证流,然后通过调用 VerifyUserAttribute 提交验证代码。

  3. 该服务向应用程序返回信息,表示注册过程已完成且用户账户正等待确认。响应中包含关于确认代码所发送到位置的信息。此时,用户账户处于未确认状态,而且用户的电子邮件地址和电话号码未经验证。

  4. 现在,应用程序会提示用户输入确认代码。用户无需立即输入代码。但是,用户只有在输入确认代码后才可登录。

  5. 用户在应用程序中输入确认代码。

  6. 应用程序调用 ConfirmSignUp 以将代码发送到 Amazon Cognito 服务,该服务将验证代码,如果代码正确,则将用户账户设置为确认状态。成功确认用户账户之后,Amazon Cognito 服务会自动将用于确认 (电子邮件或电话号码) 的属性标记为已验证。除非此属性的值发生更改,否则用户无需再次进行验证。

  7. 此时,用户账户处于已确认状态,用户可以登录。

允许用户在您的应用程序中注册但以管理员身份进行确认

  1. 用户通过输入用户名称、电话号码和/或电子邮件地址及其他可能属性,在您的应用程序中进行注册。

  2. Amazon Cognito 服务收到来自应用程序的注册请求。验证该请求包含注册所需的所有属性之后,该服务将完成注册过程,并向应用程序返回信息,表示注册已完成且正在等待确认。此时,用户账户处于未确认状态。账户经过确认后,用户才可登录。

  3. 管理员在 Amazon Cognito 控制台 (通过在 Users 选项卡中查找用户账户并选择 Confirm 按钮) 或 CLI (通过使用 admin-confirm-sign-up 命令) 中确认用户账户。Confirm 按钮和 admin-confirm-sign-up 命令都使用 AdminConfirmSignUp API 来执行确认。

  4. 此时,用户账户处于已确认状态,用户可以登录。

计算 SecretHash 值

以下 Amazon Cognito 用户池 API 具有 SecretHash 参数:

SecretHash 值是的 Base 64 编码的加密哈希消息身份验证代码 (HMAC),使用用户池客户端的私有密钥、用户名称以及消息中的客户端 ID 进行计算。以下伪代码显示如何计算此值。在此伪代码中,+ 表示串联,HMAC_SHA256 代表使用 HmacSHA256 生成 HMAC 值的函数,Base64 代表生成哈希输出的 Base-64 编码版本的函数。

Base64 ( HMAC_SHA256 ( "Client Secret Key", "Username" + "Client Id" ) )

或者,您可以在服务器端 Java 应用程序代码中使用以下代码示例:

import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public static String calculateSecretHash(String userPoolClientId, String userPoolClientSecret, String userName) { final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; SecretKeySpec signingKey = new SecretKeySpec( userPoolClientSecret.getBytes(StandardCharsets.UTF_8), HMAC_SHA256_ALGORITHM); try { Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); mac.update(userName.getBytes(StandardCharsets.UTF_8)); byte[] rawHmac = mac.doFinal(userPoolClientId.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(rawHmac); } catch (Exception e) { throw new RuntimeException("Error while calculating "); } }

无需验证电子邮件或电话号码即可确认用户账户

预注册 Lambda 触发器可用于在注册时自动确认用户账户,而无需提供确认代码或验证电子邮件或电话号码。通过此方法进行确认的用户可立即登录,而无需接收代码。

您还可通过此触发器将用户的电子邮件或电话号码标记为已验证。

注意

虽然这种方法对刚入门的用户而言很方便,但我们建议至少自动验证电子邮件或电话号码之一。否则,如果用户忘记密码,可能就无法进行恢复。

如果您不要求用户在注册时接收并输入确认代码,也不在预注册 Lambda 触发器中自动验证电子邮件和电话号码,则承担着不具备关于该用户账户的经验证电子邮件地址或电话号码的风险。用户可以稍后验证电子邮件地址或电话号码。但是,如果用户忘记自己的密码且没有经过验证的电子邮件地址或电话号码,则用户账户将被锁定,因为“忘记密码”流程需要经验证的电子邮件或电话号码以便向用户发送验证代码。

当用户更改其电子邮件或电话号码时应进行验证

当用户在您的应用程序中更改其电子邮件地址或电话号码时,该属性将标记为未经验证。如果针对所更新的属性启用了自动验证,则该服务将立即向用户发送包含验证代码的消息,用户应输入此代码以验证更改。您可以使用自定义消息 Lambda 触发器来自定义此消息。有关更多信息,请参阅 使用 Lambda 触发器自定义用户池工作流。每当用户的电子邮件地址或电话号码未经过验证时,您的应用程序均应显示未经验证状态,并为用户提供一个按钮或链接,以验证其新的电子邮件或电话号码。

针对由管理员或开发人员创建的用户账户的确认和验证过程

由管理员或开发人员创建的用户账户已经处于已确认状态,所以用户无需输入确认代码。Amazon Cognito 服务向这些用户发送的邀请消息包含用户名称和临时密码。用户需要在登录前更改密码。有关更多信息,请参阅以管理员身份创建用户账户中的 Message Customizations 选项卡使用 Lambda 触发器自定义用户池工作流中的自定义消息触发器。

针对导入的用户账户的确认和验证过程

使用 AWS 管理控制台、CLI 或 API 中的用户导入功能创建的用户账户 (请参阅通过 CSV 文件将用户导入用户池中) 已处于已确认状态,因此用户无需输入确认代码。没有发送邀请消息。但是,导入的用户账户要求用户首先调用 ForgotPassword API 来请求代码,然后通过调用 ConfirmForgotPassword API 来使用发送的代码创建密码,之后方可登录。有关更多信息,请参阅 要求导入的用户重置密码

导入用户账户时,用户的电子邮件或电话号码必须已标记为已验证,从而用户无需验证即可登录。