通过 Amazon SDK 管理身份验证方法 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

通过 Amazon SDK 管理身份验证方法

Amazon Cognito 用户池中的用户可以通过多种初始登录选项(也称为因素)进行登录。对于某些因素,用户还可以继续完成多重身份验证(MFA)。这些第一重因素包括用户名和密码、一次性密码、通行密钥以及自定义身份验证。有关更多信息,请参阅身份验证流程。当您的应用程序内置了 UI 组件并导入了 Amazon SDK 模块时,您需要构建身份验证的应用程序逻辑。此时,您必须从两种主要方法中选择其一,并通过此方法确定要实现的身份验证机制。

您可以实现基于客户端的身份验证,即由您的应用程序(或客户端)在一开始就声明所使用的身份验证类型。另一种选择是基于选择的身份验证,即您的应用程序先收集用户名,然后请求该用户可用的身份验证类型。您可以根据需求,在同一个应用程序中同时实现这两种模式,或在不同的应用程序客户端之间分别使用。每种方法都有其独有的功能,例如:基于客户端的身份验证支持自定义身份验证,而基于选择的身份验证则支持无密码身份验证。

在通过 Amazon SDK 调用用户池 API 实现身份验证的定制应用程序中,您必须构建与用户池配置、应用程序客户端配置以及客户端偏好相匹配的 API 请求。如果 InitiateAuth 会话以 AuthFlow 值为 USER_AUTH 开始,则启动基于选择的身份验证。Amazon Cognito 会在 API 响应中返回一个质询,内容为用户的首选身份验证方法或可用选项列表。如果会话以 AuthFlow 值为 CUSTOM_AUTH 开始,则直接进入基于 Lambda 触发器的自定义身份验证流程。

有些身份验证方法固定为两种流程中的一种,有些方法在两种流程中都可用。

基于选择的身份验证

您的应用程序可以在基于选择的身份验证中请求以下身份验证方法。在 InitiateAuthAdminInitiateAuthPREFERRED_CHALLENGE 参数中,或在 RespondToAuthChallengeAdminRespondToAuthChallengeChallengeName 参数中声明这些选项。

要在 API 上下文中查看这些选项,请参阅 RespondToAuthChallenge 中的 ChallengeName

基于选择的登录会发出一个质询以响应您的初始请求。该质询要么验证所请求的选项是否可用,要么提供一份可用选项列表。您的应用程序可将这些选项显示给用户,用户随后输入其首选登录方式的凭证,并通过响应质询继续完成身份验证。

您的身份验证流程中有以下基于选择的选项。此类请求均要求您的应用程序首先收集用户名,或从缓存中获取用户名。

  1. 仅使用 USERNAME 作为 AuthParameters 来请求选项。Amazon Cognito 返回 SELECT_CHALLENGE 质询。随后,您的应用程序可以提示用户选择一种质询方式,并将该选择作为响应返回给用户池。

  2. 通过在 PREFERRED_CHALLENGEAuthParameters 以及您首选质询(如有)的参数来请求一个首选质询。例如,如果您请求的 PREFERRED_CHALLENGEPASSWORD_SRP,则还必须包含 SRP_A。如果用户、用户池和应用程序客户端均已配置支持该首选质询,Amazon Cognito 将返回该质询的下一步骤,例如,在 PASSWORD_SRP 流程中返回 PASSWORD_VERIFIER,或在 EMAIL_OTPSMS_OTP 流程中返回 CodeDeliveryDetails。如果首选质询不可用,Amazon Cognito 将返回 SELECT_CHALLENGE,并附带一份可用质询列表。

  3. 首先让用户登录,然后再请求其基于选择的身份验证选项。使用已登录用户的访问令牌调用 GetUserAuthFactors 请求,可返回该用户可用的基于选择的身份验证因素及其 MFA 设置。通过此身份验证选项,用户可先使用用户名和密码登录,随后启用其他形式的身份验证。您也可以使用此操作,为已通过首选质询完成登录的用户检查其他可用选项。

为应用程序客户端配置基于选择的身份验证,请在允许的身份验证流程中添加 ALLOW_USER_AUTH。您还必须在用户池配置中选择要允许的基于选择的身份验证因素。以下流程说明了如何选择基于选择的身份验证因素。

Amazon Cognito console
在用户池中配置基于选择的身份验证选项
  1. 登录到 Amazon,导航到 Amazon Cognito 用户池控制台。选择一个用户池或新建一个。

  2. 在用户池配置中,选择登录菜单。找到基于选择的登录选项,然后选择编辑

  3. 密码选项始终可用。这包括 PASSWORDPASSWORD_SRP 流程。选择要添加到用户选项中的其他选项。您可以为 WEB_AUTHN 添加通行密钥,为 EMAIL_OTP 添加电子邮件消息一次性密码,为 SMS_OTP 添加 SMS 消息一次性密码

  4. 选择保存更改

API/SDK

以下 CreateUserPoolUpdateUserPool 请求正文的片段配置了所有可用的基于选择的身份验证选项。

"Policies": { "SignInPolicy": { "AllowedFirstAuthFactors": [ "PASSWORD", "WEB_AUTHN", "EMAIL_OTP", "SMS_OTP" ] } },

基于客户端的身份验证

基于客户端的身份验证支持以下身份验证流程。在 InitiateAuthAdminInitiateAuthAuthFlow 参数中声明这些选项。

  1. USER_PASSWORD_AUTHADMIN_USER_PASSWORD_AUTH

    使用永久密码登录

    登录后进行 MFA

    此身份验证流程在基于选择的身份验证中等同于 PASSWORD

  2. USER_SRP_AUTH

    使用永久密码和安全有效载荷登录

    登录后进行 MFA

    此身份验证流程在基于选择的身份验证中等同于 PASSWORD_SRP

  3. REFRESH_TOKEN_AUTH

    刷新令牌

    此身份验证流程仅在基于客户端的身份验证中可用。

  4. CUSTOM_AUTH

    自定义身份验证

    此身份验证流程仅在基于客户端的身份验证中可用。

对于基于客户端的身份验证,Amazon Cognito 假设您已在用户开始身份验证流程之前确定了其希望使用的身份验证方式。确定用户要提供的登录因素的逻辑必须通过默认设置或自定义提示来确定,然后在首次向用户池发起的请求中声明。InitiateAuth 请求需声明一个与所列选项之一直接对应的登录 AuthFlow,例如 USER_SRP_AUTH。通过该声明,该请求还包含启动身份验证所需的参数,例如 USERNAMESECRET_HASHSRP_A。Amazon Cognito 可能会在该请求之后返回额外的质询,例如针对 SRP 的 PASSWORD_VERIFIER,或针对使用 TOTP MFA 的密码登录的 SOFTWARE_TOKEN_MFA

为应用程序客户端配置基于客户端的身份验证,请在允许的身份验证流程中添加 ALLOW_USER_AUTH 之外的任何身份验证流程。示例包括 ALLOW_USER_PASSWORD_AUTHALLOW_CUSTOM_AUTHALLOW_REFRESH_TOKEN_AUTH。允许基于客户端的身份验证流程无需额外的用户池配置。