通过 Amazon SDK 管理身份验证方法
Amazon Cognito 用户池中的用户可以通过多种初始登录选项(也称为因素)进行登录。对于某些因素,用户还可以继续完成多重身份验证(MFA)。这些第一重因素包括用户名和密码、一次性密码、通行密钥以及自定义身份验证。有关更多信息,请参阅身份验证流程。当您的应用程序内置了 UI 组件并导入了 Amazon SDK 模块时,您需要构建身份验证的应用程序逻辑。此时,您必须从两种主要方法中选择其一,并通过此方法确定要实现的身份验证机制。
您可以实现基于客户端的身份验证,即由您的应用程序(或客户端)在一开始就声明所使用的身份验证类型。另一种选择是基于选择的身份验证,即您的应用程序先收集用户名,然后请求该用户可用的身份验证类型。您可以根据需求,在同一个应用程序中同时实现这两种模式,或在不同的应用程序客户端之间分别使用。每种方法都有其独有的功能,例如:基于客户端的身份验证支持自定义身份验证,而基于选择的身份验证则支持无密码身份验证。
在通过 Amazon SDK 调用用户池 API 实现身份验证的定制应用程序中,您必须构建与用户池配置、应用程序客户端配置以及客户端偏好相匹配的 API 请求。如果 InitiateAuth 会话以 AuthFlow 值为 USER_AUTH 开始,则启动基于选择的身份验证。Amazon Cognito 会在 API 响应中返回一个质询,内容为用户的首选身份验证方法或可用选项列表。如果会话以 AuthFlow 值为 CUSTOM_AUTH 开始,则直接进入基于 Lambda 触发器的自定义身份验证流程。
有些身份验证方法固定为两种流程中的一种,有些方法在两种流程中都可用。
基于选择的身份验证
您的应用程序可以在基于选择的身份验证中请求以下身份验证方法。在 InitiateAuth 或 AdminInitiateAuth 的 PREFERRED_CHALLENGE 参数中,或在 RespondToAuthChallenge 或 AdminRespondToAuthChallenge 的 ChallengeName 参数中声明这些选项。
-
EMAIL_OTP和SMS_OTP -
WEB_AUTHN -
PASSWORD
要在 API 上下文中查看这些选项,请参阅 RespondToAuthChallenge 中的 ChallengeName。
基于选择的登录会发出一个质询以响应您的初始请求。该质询要么验证所请求的选项是否可用,要么提供一份可用选项列表。您的应用程序可将这些选项显示给用户,用户随后输入其首选登录方式的凭证,并通过响应质询继续完成身份验证。
您的身份验证流程中有以下基于选择的选项。此类请求均要求您的应用程序首先收集用户名,或从缓存中获取用户名。
-
仅使用
USERNAME作为AuthParameters来请求选项。Amazon Cognito 返回SELECT_CHALLENGE质询。随后,您的应用程序可以提示用户选择一种质询方式,并将该选择作为响应返回给用户池。 -
通过在
PREFERRED_CHALLENGE的AuthParameters以及您首选质询(如有)的参数来请求一个首选质询。例如,如果您请求的PREFERRED_CHALLENGE为PASSWORD_SRP,则还必须包含SRP_A。如果用户、用户池和应用程序客户端均已配置支持该首选质询,Amazon Cognito 将返回该质询的下一步骤,例如,在PASSWORD_SRP流程中返回PASSWORD_VERIFIER,或在EMAIL_OTP和SMS_OTP流程中返回 CodeDeliveryDetails。如果首选质询不可用,Amazon Cognito 将返回SELECT_CHALLENGE,并附带一份可用质询列表。 -
首先让用户登录,然后再请求其基于选择的身份验证选项。使用已登录用户的访问令牌调用 GetUserAuthFactors 请求,可返回该用户可用的基于选择的身份验证因素及其 MFA 设置。通过此身份验证选项,用户可先使用用户名和密码登录,随后启用其他形式的身份验证。您也可以使用此操作,为已通过首选质询完成登录的用户检查其他可用选项。
要为应用程序客户端配置基于选择的身份验证,请在允许的身份验证流程中添加 ALLOW_USER_AUTH。您还必须在用户池配置中选择要允许的基于选择的身份验证因素。以下流程说明了如何选择基于选择的身份验证因素。
基于客户端的身份验证
基于客户端的身份验证支持以下身份验证流程。在 InitiateAuth 或 AdminInitiateAuth 的 AuthFlow 参数中声明这些选项。
对于基于客户端的身份验证,Amazon Cognito 假设您已在用户开始身份验证流程之前确定了其希望使用的身份验证方式。确定用户要提供的登录因素的逻辑必须通过默认设置或自定义提示来确定,然后在首次向用户池发起的请求中声明。InitiateAuth 请求需声明一个与所列选项之一直接对应的登录 AuthFlow,例如 USER_SRP_AUTH。通过该声明,该请求还包含启动身份验证所需的参数,例如 USERNAME、SECRET_HASH 和 SRP_A。Amazon Cognito 可能会在该请求之后返回额外的质询,例如针对 SRP 的 PASSWORD_VERIFIER,或针对使用 TOTP MFA 的密码登录的 SOFTWARE_TOKEN_MFA。
要为应用程序客户端配置基于客户端的身份验证,请在允许的身份验证流程中添加 ALLOW_USER_AUTH 之外的任何身份验证流程。示例包括 ALLOW_USER_PASSWORD_AUTH、ALLOW_CUSTOM_AUTH、ALLOW_REFRESH_TOKEN_AUTH。允许基于客户端的身份验证流程无需额外的用户池配置。