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

如何判断AWS Cognito IDP用户已完成MFA设备绑定?

判断AWS Cognito用户是否已完成MFA设备绑定的方法

有两种可靠的方式可以判断用户是否已经完成软件令牌MFA绑定,从而跳过绑定流程:

方法一:通过admin_get_user API查询用户MFA状态

直接调用Cognito的admin_get_user接口,获取用户的MFA配置信息,从中判断是否已绑定软件令牌:

client = boto3.client("cognito-idp", <region>)
response = client.admin_get_user(
    UserPoolId=user_pool_id,
    Username=username
)

# 检查用户是否已启用软件令牌MFA
is_mfa_bound = False
# 1. 查看UserMFASettingList是否包含SOFTWARE_TOKEN_MFA
if "UserMFASettingList" in response and "SOFTWARE_TOKEN_MFA" in response["UserMFASettingList"]:
    is_mfa_bound = True
# 2. 或者查看SoftwareTokenMfaSettings的Enabled状态
if "SoftwareTokenMfaSettings" in response and response["SoftwareTokenMfaSettings"]["Enabled"]:
    is_mfa_bound = True

if is_mfa_bound:
    # 用户已绑定MFA,直接走用户名+密码+TOTP认证流程
    pass
else:
    # 用户未绑定,执行你的MFA绑定流程
    pass

方法二:在首次认证时通过响应自动判断

当你调用admin_initiate_auth(用户名+密码认证)时,Cognito会根据用户的MFA状态返回不同的响应:

  • 如果用户已绑定MFA,响应中会包含ChallengeName: SOFTWARE_TOKEN_MFA,此时需要引导用户输入TOTP完成认证;
  • 如果用户未绑定MFA,响应会直接返回AuthenticationResult(包含AccessToken等),这时候就需要执行你的MFA绑定流程。

修改你的认证代码如下:

client = boto3.client("cognito-idp", <region>)
response = client.admin_initiate_auth(
    UserPoolId=user_pool_id,
    ClientId=app_client_id,
    AuthFlow='ADMIN_NO_SRP_AUTH',
    AuthParameters={
        "USERNAME": username,
        "PASSWORD": password
    })

if "ChallengeName" in response and response["ChallengeName"] == "SOFTWARE_TOKEN_MFA":
    # 用户已绑定MFA,需要验证TOTP
    session = response["Session"]
    # 引导用户输入TOTP码,然后调用respond_to_auth_challenge
    totp_code = input("请输入MFA验证码:")
    auth_response = client.admin_respond_to_auth_challenge(
        UserPoolId=user_pool_id,
        ClientId=app_client_id,
        ChallengeName="SOFTWARE_TOKEN_MFA",
        Session=session,
        ChallengeResponses={
            "USERNAME": username,
            "SOFTWARE_TOKEN_MFA_CODE": totp_code
        }
    )
    # 获取最终的认证结果
    auth_result = auth_response["AuthenticationResult"]
else:
    # 用户未绑定MFA,执行你的绑定流程
    auth_result = response['AuthenticationResult']
    access_token = auth_result["AccessToken"]
    # 后续执行associate_software_token、verify_software_token、admin_set_user_mfa_preference步骤

这种方式更贴合实际认证流程,不需要额外调用查询接口,直接通过首次认证的响应就能判断用户是否需要绑定MFA。

内容的提问来源于stack exchange,提问作者Freek Wiekmeijer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:24