管理错误响应 - Amazon Cognito
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

管理错误响应

当用户不存在时,您可以自定义 Cognito 用户池在身份验证、确认和密码恢复相关操作期间返回的错误和响应。通过使用用户池应用程序客户端的 PreventUserExistenceErrors 设置,您可以自定义是否引发与用户存在相关的错误。如果未启用该设置或将其设置为 LEGACY,则在输入中提供不存在的用户名时,Cognito 身份验证、确认和密码恢复操作将返回 UserNotFoundException

启用此设置后,Cognito 身份验证 API 将返回一个通用的身份验证失败响应,指示用户名或密码不正确。Cognito 帐户确认和密码恢复 API 返回一个响应,指示当启用此设置且此用户不存在时,代码已发送到模拟的传输媒介。以下是 PreventUserExistenceErrors 设置为 ENABLED 时,Cognito 操作的详细行为:

  • 用户身份验证操作:此类操作包括:AdminInitiateAuthAdminRespondToAuthChallengeInitiateAuthRespondToAuthChallenge。可以使用任一身份验证流程方法进行身份验证:

    • 基于用户名密码的身份验证 - 在这些身份验证流程(ADMIN_USER_PASSWORD_AUTHUSER_PASSWORD_AUTH)中,在 InitiateAuth 的一次调用中收到用户名和密码。Cognito 返回一个通用 NotAuthorizedException 错误,指示用户名或密码不正确。如果禁用了用户且密码不正确,则该错误还将表明用户名或密码不正确。

    • 基于 SRP 的身份验证 - 在这些身份验证流程 (USER_SRP_AUTH) 中,Cognito 服务在第一步中收到用户名和 SRP 参数 “A”。作为响应,Cognito 根据 SRP 协议为用户返回 SRP 参数“B”和“salt”。如果找不到用户,Cognito 会在第一步中返回一个模拟响应,如 RFC 5054 中所述。Cognito 始终针对相同的用户名和用户池组合返回相同的“salt”以及 UUID 格式的内部用户 ID。在下一个 RespondToAuthChallenge 操作中,当提供密码证明时,Cognito 返回一个通用 NotAuthorizedException 错误,指示用户名或密码不正确。请注意,如果您使用的是支持多种用户名方案的基于验证的别名,并且不可变的用户名格式不是 UUID,则首选设置是使用“基于用户名密码的身份验证”来模拟一般响应。

  • ForgotPassword:当找不到用户,用户被禁用或用户没有恢复其密码的机制时,Cognito 会为用户始终返回 CodeDeliveryDetails 以及模拟的传递媒介。模拟的传递媒介由用户池的输入用户名格式和验证设置决定。

  • ConfirmForgotPassword:对于不存在或禁用的用户,Cognito 返回 CodeMismatchException 错误。如果在上一步中未通过使用 ForgotPassword 请求代码,Cognito 将返回 ExpiredCodeException 错误。

  • ResendConfirmationCode:对于不存在或已禁用的用户,Cognito 始终为用户返回模拟的 CodeDeliveryDetails。模拟的传递媒介由用户池的输入用户名格式和验证设置决定。对于现有用户,Cognito 会向用户电子邮件或电话发送确认码。

  • ConfirmSignUp:对于不存在或禁用的用户,Cognito 返回 ExpiredCodeException。如果已经确认用户并且提供的代码有效,则 NotAuthorizedException 返回错误,说明该账户已获得确认。否则,如果代码无效,则返回 CodeMismatchException 错误。

注意

在 2020 年 2 月 15 日之后,如果未提供任何值,则对于新创建的用户池客户端,PreventUserExistenceErrors 的默认值将为 ENABLED

无论 PreventUserExistenceErrors 的值是什么,当已经使用了用户名时,SignUp 操作都会继续返回 UsernameExistsException。为防止在 SignUp 期间对于电子邮件或电话号码发生 UsernameExistsException 错误,您可以使用基于验证的别名。有关更多信息,请参阅 Amazon Cognito 用户池 API 参考 中的 AliasAttributes

这样,即使存在具有给定电子邮件的账户,但仅当提供正确的验证码时才会在 ConfirmSignUp 期间返回 UsernameExistsException,此时 SignUp 仍会成功。有关更多信息,请参阅别名概述

使用用户迁移 Lambda 触发器,当 Lambda 触发器在原始事件上下文中设置了空响应时,Cognito 将为不存在的用户返回模拟响应。有关更多信息,请参阅 迁移用户 Lambda 触发器

如果您正在使用 自定义身份验证质询 Lambda 触发器 并启用此新设置,则会在 DefineAuthChallengVerifyAuthChallengeCreateAuthChallenge Lambda 触发器的请求中传递一个名为 userNotFound 的新布尔参数。您可以使用它来模拟非现有用户的自定义身份验证质询。同样,为非现有用户调用预身份验证 Lambda 触发器,并在请求中传递名为 userNotFound 的布尔参数。