首页 > 解决方案 > Cognito 用户池中的 SMS MFA 状态是通过调用 setPreferredMFA 设置的还是其他的?

问题描述

使用setPreferredMFA时,即使设置了 setPreferredMFA,Cognito 用户池中的 SMS MFA 状态也会被禁用。

SMS MFA 状态代表什么,当我启用或禁用它时它会做什么?

谢谢

标签: amazon-cognitomulti-factor-authentication

解决方案


这只不过是 AWS 控制台/API 响应中的不一致。示例:让我们为用户启用 SMS MFA:

aws cognito-idp set-user-mfa-preference --sms-mfa-settings Enabled=true,PreferredMfa=true --access-token <value>

是的,在控制台中,它仍然看起来好像没有启用 SMS MFA。但是这是错误的。让我们获取用户的数据:

aws cognito-idp get-user --access-token <value>
{
    "Username": "your-email@example.com",
    "UserAttributes": [
        {
            "Name": "sub",
            "Value": "491a3eba-381f-4c87-a7d6-befa21e49e82"
        },
        {
            "Name": "email_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number",
            "Value": "+1234567890"
        },
        {
            "Name": "email",
            "Value": "your-email@example.com"
        }
    ],
    "PreferredMfaSetting": "SMS_MFA",
    "UserMFASettingList": [
        "SMS_MFA"
    ]
}

您要查看的是PreferredMfaSetting属性。它告诉您用户为自己选择的内容。

如果您现在尝试像这样进行身份验证:

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --client-id <value> --auth-parameters USERNAME=<value>,PASSWORD=<value>

您将收到如下回复:

{
    "ChallengeName": "SMS_MFA",
    "Session": "<session-value>",
    "ChallengeParameters": {
        "CODE_DELIVERY_DELIVERY_MEDIUM": "SMS",
        "CODE_DELIVERY_DESTINATION": "+*********7890",
        "USER_ID_FOR_SRP": "your-email@example.com"
    }
}

好的,那么控制台中的这个东西在做什么?它实际上已被弃用。看看MFAOptions这里的文档:https ://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html

因此,让我们通过控制台启用 SMS MFA,然后检查以下输出GetUser

{
    "Username": "your-email@example.com",
    "UserAttributes": [
        {
            "Name": "sub",
            "Value": "491a3eba-381f-4c87-a7d6-befa21e49e82"
        },
        {
            "Name": "email_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number_verified",
            "Value": "true"
        },
        {
            "Name": "phone_number",
            "Value": "+1234567890"
        },
        {
            "Name": "email",
            "Value": "your-email@example.com"
        }
    ],
    "MFAOptions": [
        {
            "DeliveryMedium": "SMS",
            "AttributeName": "phone_number"
        }
    ],
    "PreferredMfaSetting": "SMS_MFA",
    "UserMFASettingList": [
        "SMS_MFA"
    ]
}

差不多就是这样。


推荐阅读