User池身份验证流程 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

User池身份验证流程

除密码外,现代身份验证流程还包含新的质询类型,来验证用户身份。我们将身份验证归纳为两个通用步骤,这两个步骤通过两个 API 操作实现:InitiateAuthRespondToAuthChallenge

用户通过回答连续的质询进行身份验证,直到身份验证失败或用户获得令牌。通过这两个可以重复执行以包含不同质询的步骤,我们可以支持任何自定义身份验证流程。

您可以使用 Amazon Lambda 触发器自定义身份验证流程。作为身份验证流程的一部分,这些触发器将发布并验证自己的质询。

您还可以在安全后端服务器上对用户使用管理员身份验证流。您可以使用用户迁移身份验证流来允许用户迁移,而无需用户重置其密码。

注意

我们允许五次失败的登录尝试。之后,我们开始临时锁定,其锁定时间从 1 秒开始呈指数增长,每次失败尝试后成倍增加,最长约为 15 分钟。暂时锁定期间的尝试将被忽略。在临时锁定期之后,如果下一次尝试失败,则新的临时锁定开始时间是最后一次的两倍。等待大约 15 分钟而不进行任何尝试也会重置临时锁定。请注意,这种行为可能会发生变化。

客户端身份验证流程

以下是用户池身份验证对使用Amazon Mobile SDK for Android、Amazon Mobile SDK for iOS或适用于 JavaScript 的 Amazon 软件开发工具包创建的最终用户客户端应用程序的工作方式:

  1. 用户将他们的用户名和密码输入到应用程序中。

  2. 应用程序使用用户的用户名和 SRP 详细信息调用 InitiateAuth 操作。

    该方法返回身份验证参数。

    注意

    应用程序通过使用 Android、iOS 和 JavaScript 开发工具包中支持的 Amazon Cognito SRP 来生成 SRP 详细信息。

  3. 应用程序调用 RespondToAuthChallenge 操作。如果调用成功,则返回用户的令牌,并且身份验证流程完成。

    如果需要另一个质询,则不返回令牌。相反,对 RespondToAuthChallenge 的调用会返回一个会话。

  4. 如果 RespondToAuthChallenge 返回一个会话,应用程序将再次调用 RespondToAuthChallenge,这次使用会话和质询响应(例如,MFA 代码)。

服务器端身份验证流程

如果您没有最终用户应用程序,而是使用 Java、Ruby 或 Node.js 安全后端或服务器端应用程序,则可以对 Amazon Cognito 用户池使用经过身份验证的服务器端 API。

对于服务器端应用程序,用户池身份验证与客户端应用程序的身份验证类似,但以下情况除外:

  • 服务器端应用程序调用 AdminInitiateAuth API 操作(而不是 InitiateAuth)。此操作需要 Amazon 管理员凭证。此操作返回身份验证参数。

  • 具有身份验证参数后,应用程序会调用 AdminRespondToAuthChallenge API 操作(而不是 RespondToAuthChallenge),这也需要 Amazon 管理员凭证。

AdminInitiateAuthAdminRespondToAuthChallenge 操作不能接受用于管理员登录的用户名和密码用户凭证,除非您通过执行以下操作之一明确启用它们:

  • 在服务器端应用程序对 CreateUserPoolClientUpdateUserPoolClient 的调用中为 ExplicitAuthFlow 参数传递 ADMIN_USER_PASSWORD_AUTH(以前称为 ADMIN_NO_SRP_AUTH)。

  • 选择Enable sign-in API for server-based authentication (ADMIN_USER_PASSWORD_AUTH)中的应用程序客户端中的选项卡创建用户池。有关更多信息,请参阅 配置用户池应用程序客户端

自定义身份验证流程

Amazon Cognito 用户池还支持自定义身份验证流程,这可以帮助您使用Amazon Lambda触发器。

自定义身份验证流程旨在允许一系列可自定义以满足不同需求的质询和响应周期。流程开始调用InitiateAuthAPI 操作,该 API 指示将使用的身份验证类型并提供所有初始身份验证参数。Amazon Cognito 将回复InitiateAuth使用以下操作之一调用:

  • 用户质询及会话和参数。

  • 错误(如果用户未能通过身份验证)

  • ID、访问和刷新令牌(如果 InitiateAuth 调用中提供的参数足以使用户登录)。(通常需要首先回答质询,但这由您的自定义代码决定。)

如果 Amazon Cognito 响应InitiateAuth调用时,应用程序会收集更多输入并调用RespondToAuthChallenge操作,提供质询响应并传回会话。Amazon Cognito 响应RespondToAuthChallenge调用类似于InitiateAuth调用,提供令牌 (如果用户已登录)、另一质询或错误。如果返回另一质询,则序列以应用程序调用RespondToAuthChallenge直到用户登录或返回错误。API 文档中提供了有关 InitiateAuthRespondToAuthChallenge API 操作的更多详细信息。

内置身份验证流程和质询

Amazon Cognito 有一些内置AuthFlowChallengeName值,以通过安全远程密码 (SRP) 协议验证用户名和密码。此流程内置在适用于 Amazon Cognito 的 iOS、Android 和 JavaScript 开发工具包中。概括来说,流程通过发送USER_SRP_AUTH作为AuthFlowInitiateAuth随着USERNAMESRP_A中的值AuthParameters。如果 InitiateAuth 调用成功,则响应将在质询参数中包括 PASSWORD_VERIFIER 作为 ChallengeNameSRP_B。然后,应用程序将使用 ChallengeResponses 中的 PASSWORD_VERIFIER ChallengeName 和必要参数调用 RespondToAuthChallenge。如果 RespondToAuthChallenge 调用成功并且用户已登录,则将返回令牌。如果针对用户启用了 Multi-Factor Authentication (MFA),则会返回 SMS_MFAChallengeName,并且应用程序会通过再一次调用 RespondToAuthChallenge 提供必要代码。

自定义身份验证流程和质询

应用可以启动自定义身份验证流程,具体方法是:InitiateAuth替换为CUSTOM_AUTH作为Authflow。借助自定义身份验证流程,可通过三个 Amazon Lambda 触发器控制响应的质询和验证。

  • 这些区域有:DefineAuthChallengeLambda 触发器将以前的质询和响应的会话数组作为输入。然后,它输出下一个质询名称和布尔值,指示用户是否通过身份验证(并且应被授予令牌)。此 Lambda 触发器是一个状态机,可通过质询控制用户的路径。

  • 这些区域有:CreateAuthChallengeLambda 触发器将质询名称作为输入并生成质询和参数以评估响应。CreateAuthChallenge被调用DefineAuthChallenge返回CUSTOM_CHALLENGE作为下一质询,并且在质询元数据参数中传递下一质询类型。

  • 这些区域有:VerifyAuthChallengeResponseLambda 函数会评估响应并返回布尔值以表明响应是否有效。

自定义身份验证流程还可以使用内置质询的组合,例如 SRP 密码验证和通过短信进行的 MFA。它可以使用自定义质询,如验证码或秘密问题。

在自定义身份验证流程中使用 SRP 密码验证

如果您希望将 SRP 包含在自定义身份验证流程中,则您需要开始使用它。

  • 要在自定义流程中启动 SRP 密码验证,应用程序将 CUSTOM_AUTH 作为 Authflow 来调用 InitiateAuth。它包括在 AuthParameters 映射 SRP_A:(SRP A 值)和 CHALLENGE_NAME: SRP_A 中。

  • 这些区域有:DefineAuthChallengeLambda 触发器以初始会话调用challengeName: SRP_AchallengeResult: true,并且应该使用challengeName: PASSWORD_VERIFIERissueTokens: false, 和failAuthentication: false

  • 接下来,该应用程序需要使用 challengeName: PASSWORD_VERIFIERchallengeResponses 映射中 SRP 所需的其他参数调用 RespondToAuthChallenge

  • 如果密码已验证,DefineAuthChallengeLambda 触发器以第二个会话调用challengeName: PASSWORD_VERIFIERchallengeResult: true。在这一点上,DefineAuthChallengeLambda 触发器可以响应challengeName: CUSTOM_CHALLENGE启动自定义质询。

  • 如果为用户启用了 MFA,则会在验证密码后自动处理 MFA。

注意

Amazon Cognito 托管的登录网页不支持自定义身份验证流程。

有关 Lambda 触发器的更多信息,包括示例代码,请参阅使用 Lambda 触发器自定义用户池工作流

注意

Amazon Cognito 托管的登录网页不支持自定义身份验证流程。

管理员身份验证流程

描述 自定义身份验证流程 并使用 SRP 进行密码验证的 API 操作是推荐的身份验证方法。iOS、Android 和 JavaScript 开发工具包均基于上述方法,让使用 SRP 变得很轻松。但是,如果您希望避免 SRP 计算,还可以使用另一组专为在安全后端服务器上使用而设计的管理员 API 操作。对于这些后端管理员实施,AdminInitiateAuth 用于替代 InitiateAuth,并且 AdminRespondToAuthChallenge 用于替代 RespondToAuthChallenge。在使用这些操作时,密码能够以明文形式提交,因此无需进行 SRP 计算。示例如下:

AdminInitiateAuth Request { "AuthFlow":"ADMIN_USER_PASSWORD_AUTH", "AuthParameters":{ "USERNAME":"<username>", "PASSWORD":"<password>" }, "ClientId":"<clientId>", "UserPoolId":"<userPoolId>" }

这些管理员身份验证操作要求提供开发人员凭证,并使用 Amazon 签名版本 4 (SigV4) 签名过程。这些操作在标准Amazon开发工具包(包包包包),便于在 Lambda 函数中使用。Node.js 为了使用这些操作并让它们接受明文密码,您必须在控制台中为应用程序启用这些操作。或者,您可以在调用 CreateUserPoolClientUpdateUserPoolClient 时为 ExplicitAuthFlow 参数传递 ADMIN_USER_PASSWORD_AUTH。对于 InitiateAuthRespondToAuthChallenge 操作,系统不接受 ADMIN_USER_PASSWORD_AUTH AuthFlow

AdminInitiateAuth 响应 ChallengeParameters 中,USER_ID_FOR_SRP 属性(如果显示)将包含用户的实际用户名而不是别名(如电子邮件地址或电话号码)。在 AdminRespondToAuthChallenge 调用的 ChallengeResponses 中,您必须在 USERNAME 参数中传递此用户名。

注意

管理员身份验证流程专为后端管理员实施而设计,因此,不支持设备跟踪。如果启用了设备跟踪,管理员身份验证成功,但任何对刷新访问令牌的调用均会失败。

用户迁移身份验证流程

可使用用户迁移 Lambda 触发器轻松地将用户从传统用户管理系统迁移到您的用户池。要避免让用户在用户迁移过程中重置密码,请选择 USER_PASSWORD_AUTH 身份验证流程。此流程在身份验证期间通过加密的 SSL 连接向服务发送用户的密码。

所有用户均完成迁移后,我们建议您切换为更安全的 SRP 流程。SRP 流程不通过网络发送任何密码。

要了解有关 Lambda 触发器的更多信息,请参阅使用 Lambda 触发器自定义用户池工作流

有关使用 Lambda 触发器迁移用户的详细信息,请参阅。利用用户迁移 Lambda 触发器将用户导入用户池