node.js - Cognito 登录 MFA 短信验证问题
问题描述
我是 AWS Cognito 的新手,目前有 2 个问题:
- 在使用 MFA SMS 进行登录时。
- 将 SMS MFA 标志设置为启用/禁用
我正在使用 Node.js 和 Amazon Cognito Identity SDK for JavaScript [1][2]
我的应用登录流程:
用户提交手机号码(然后被重定向到 TOTP 验证表)
- 此时,应用程序访问了我的 API 端点
- 反过来,如果号码已注册,则调用函数发送 TOTP
- 用户通过短信接收 TOTP 代码
- 用户输入 TOTP 代码
- 该应用程序访问我的 API 端点
- 然后调用该函数来验证 TOTP
- 如果 TOTP 验证,那么我的 API 将 Cognito Token 返回给应用程序
我已设法通过 SMS 发送 TOTP,但我找不到验证 TOTP 以获取 Cognito 令牌的方法。Github 页面中显示的示例 [3] 使用提示符,因此所有内容都包含在该函数中。但是,在我的情况下,我不能这样做,因为 2 个调用需要在 2 个不同的屏幕上进行。我试过分离 sendMFACode() 函数,但不是验证 TOTP,而是发送另一条短信。
我碰壁了,到目前为止我发现的文档/资源有限。
参考:
- https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js
- https://github.com/amazon-archives/amazon-cognito-identity-js/blob/master/src/CognitoUser.js
- 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"
}
注意:虽然成功收到短信,但我收到了无效的参数异常。
解决方案
我自己目前正在努力处理 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 正常工作,我会回过头来。
推荐阅读
- javascript - 使用 cryptojs 加密 Arraybuffer
- linux - docker内的Linux“脚本”命令未按预期写入文件
- php - 由于 laravel 中的不活动问题,该页面已过期
- windows-template-studio - 添加空白页和菜单项
- c++ - 将 Visual Studio dll 静态链接到动态链接的 sfml 项目
- google-apps-script - 将数据移动到工作表底部
- javascript - 流程中是否有禁止在作业中使用“任何”的设置?
- javascript - 具有多个音轨的视频
- javascript - 使用 jquery 更改 fa-icon 的标题
- r - Rshiny - 当应用程序从 Rstudio 桌面而不是服务器运行时,maptiles 会显示