You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确处理AWS Cognito抛出的NotAuthorizedException异常

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:45:03