Cognito 用户池中的 SMS MFA 状态是通过调用 setPreferredMFA 设置的还是其他内容?

Ste*_*fan 3 amazon-cognito multi-factor-authentication

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

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

谢谢

Ale*_*ons 5

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

aws cognito-idp set-user-mfa-preference --sms-mfa-settings Enabled=true,PreferredMfa=true --access-token <value>
Run Code Online (Sandbox Code Playgroud)

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

aws cognito-idp get-user --access-token <value>
Run Code Online (Sandbox Code Playgroud)
{
    "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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

你要看的是属性PreferredMfaSetting。它告诉您用户为自己选择了什么。

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

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --client-id <value> --auth-parameters USERNAME=<value>,PASSWORD=<value>
Run Code Online (Sandbox Code Playgroud)

您将收到如下回复:

{
    "ChallengeName": "SMS_MFA",
    "Session": "<session-value>",
    "ChallengeParameters": {
        "CODE_DELIVERY_DELIVERY_MEDIUM": "SMS",
        "CODE_DELIVERY_DESTINATION": "+*********7890",
        "USER_ID_FOR_SRP": "your-email@example.com"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "ChallengeName": "SMS_MFA",
    "Session": "<session-value>",
    "ChallengeParameters": {
        "CODE_DELIVERY_DELIVERY_MEDIUM": "SMS",
        "CODE_DELIVERY_DESTINATION": "+*********7890",
        "USER_ID_FOR_SRP": "your-email@example.com"
    }
}
Run Code Online (Sandbox Code Playgroud)

差不多就这样了。

  • @msbomrel 依赖于您在 UI 中看到的内容并不是一个好主意(至少在这种情况下)。请记住,UI 是构建在现有 API 之上的。它可能有错误(如本例所示)。使用 API 进行设置总是有效的。 (2认同)