如何正确处理AWS Cognito抛出的NotAuthorizedException异常
直接匹配完整异常Message的方案确实存在稳定性风险,不推荐作为首选方案,可参考以下更可靠的方式区分两类目标场景:
推荐方案
方案1:结合用户状态查询判断(准确率最高)
捕获NotAuthorizedException异常后,调用admin_get_user接口查询目标用户的UserStatus字段即可直接判定场景:- 用户状态为
RESET_REQUIRED:对应「临时密码完全失效需要重置」场景 - 用户状态为
CONFIRMED等正常状态:对应「用户提交的认证数据错误」场景
该方案完全不依赖异常文案内容,不受AWS后续SDK或接口文案调整影响。
代码参考示例:
import boto3 from botocore.exceptions import ClientError cognito_client = boto3.client('cognito-idp') try: resp = cognito_client.initiate_auth( ClientId='<你的Cognito客户端ID>', AuthFlow='USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': '<目标用户名>', 'PASSWORD': '<用户输入的密码>' } ) except ClientError as e: if e.response['Error']['Code'] == 'NotAuthorizedException': # 查询用户状态做细分判断 user_info = cognito_client.admin_get_user( UserPoolId='<你的Cognito用户池ID>', Username='<目标用户名>' ) if user_info['UserStatus'] == 'RESET_REQUIRED': # 处理临时密码过期逻辑 process_expired_temporary_pwd() else: # 处理认证数据错误逻辑 process_invalid_auth_info()- 用户状态为
方案2:结合登录流程逻辑判断(无额外接口调用)
无需额外调用Cognito接口,通过正常业务流程的特征即可区分:
未过期的临时密码调用initiate_auth接口时,不会直接抛出异常,会返回ChallengeName为NEW_PASSWORD_REQUIRED的响应,要求用户修改临时密码。如果用户处于临时密码登录流程时直接抛出NotAuthorizedException,即可判定为临时密码过期;普通用户登录流程下抛出的该异常,判定为认证数据错误即可。
兜底方案
如果以上方案都不适用,不要匹配完整的异常Message内容,仅匹配核心固定关键词即可,比如Temporary password has expired,AWS官方调整异常文案时核心业务相关的关键词几乎不会修改,稳定性远高于匹配整句内容。
内容的提问来源于stack exchange,提问作者Filippo Cucchetto
相关产品推荐
相关产品推荐

