首页 > 解决方案 > Cognito 登录 MFA 短信验证问题

问题描述

我是 AWS Cognito 的新手,目前有 2 个问题:

  1. 在使用 MFA SMS 进行登录时。
  2. 将 SMS MFA 标志设置为启用/禁用

我正在使用 Node.js 和 Amazon Cognito Identity SDK for JavaScript [1][2]

我的应用登录流程:

  1. 用户提交手机号码(然后被重定向到 TOTP 验证表)

    1. 此时,应用程序访问了我的 API 端点
    2. 反过来,如果号码已注册,则调用函数发送 TOTP
    3. 用户通过短信接收 TOTP 代码
  2. 用户输入 TOTP 代码
    1. 该应用程序访问我的 API 端点
    2. 然后调用该函数来验证 TOTP
  3. 如果 TOTP 验证,那么我的 API 将 Cognito Token 返回给应用程序

我已设法通过 SMS 发送 TOTP,但我找不到验证 TOTP 以获取 Cognito 令牌的方法。Github 页面中显示的示例 [3] 使用提示符,因此所有内容都包含在该函数中。但是,在我的情况下,我不能这样做,因为 2 个调用需要在 2 个不同的屏幕上进行。我试过分离 sendMFACode() 函数,但不是验证 TOTP,而是发送另一条短信。

我碰壁了,到目前为止我发现的文档/资源有限。

参考:

  1. https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js
  2. https://github.com/amazon-archives/amazon-cognito-identity-js/blob/master/src/CognitoUser.js
  3. https://stackoverflow.com/a/51394500

我的用户池设置是“MFA 可选”,因此我可以通过电子邮件方式登录(不发送短信以通过电子邮件登录。我知道这很奇怪。)到目前为止,我已经设法在代码中将 MFA 设置为必需使用enableMFA()功能。但是,Github 页面说该功能enableMFA()现在已弃用,而是使用setUserMfaPreference()。我试过了,得到了“成功”,但是当我在 AWS Web 控制台中打开它时,它仍然显示 SMS MFA 已禁用。我在这里缺少什么吗?

这是我的代码:

cognitoUser.sendMFACode(VerificationCode, {
     onSuccess: (result) => {
         console.log(result)
     },
     onFailure: (error) => {
         console.log(error)
     }
})

debug result:
{
    "code": "InvalidParameterException",
    "Name": "InvalidParameterException",
    "Message" "Invalid Parameter Required Session"
}

注意:虽然成功收到短信,但我收到了无效的参数异常。

标签: node.jsamazon-cognito

解决方案


我自己目前正在努力处理 MFA 过程,但是为了通过 SDK 启用/禁用 MFA,我找到了一种方法来让它与以下代码一起工作。

setUserSettings: (req, res) => {
    const { access_token, enable } = req.body;
    /* ISOLATE START HERE */
    const params = {
      AccessToken: access_token,
      MFAOptions: [
        {
          AttributeName: "phone_number",
          DeliveryMedium: enable == "true" ? "SMS" : null
        }
      ]
    };

    cognitoIdentityServiceProvider.setUserSettings(params, (err, data) => {
      if (err) {
        console.log(err);
        res.status(400).json({ message: err.message });
      } else {
        console.log(data);
        res.status(200).json(data);
      }
    });
    /* ISOLATE END HERE */

  },

这是使用 Node 和 Express。您可以隔离主要功能并使其在您喜欢的上下文中工作,我已经标记了剪切代码以进行隔离的位置。此调用的文档位于此处https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#setUserSettings-property

如果我让 MFA 正常工作,我会回过头来。


推荐阅读