带有 SMS MFA 的无密码 Cognito

Posted

技术标签:

【中文标题】带有 SMS MFA 的无密码 Cognito【英文标题】:Passwordless Cognito with SMS MFA 【发布时间】:2019-02-24 06:43:18 【问题描述】:

首先,见过:

https://github.com/amazon-archives/amazon-cognito-identity-js/issues/228

https://github.com/aws/amazon-cognito-auth-js/issues/18

AWS Cognito User Pool without a password:此解决方案似乎设计过度,在 dynamodb 中生成、存储、引用用户密码或手动实施 SMS MFA

当然还有 Buggy@Github 的精彩示例: https://github.com/buggy/project-x-server/tree/master/shopify/src

但是,到目前为止,我看到的所有无密码流程似乎也使用自定义身份验证,例如验证码。我希望使用 AWS 的内置 SMS MFA,否则它对我来说非常有用。

使用:

放大 React(原版)

有效的方法:

使用电话号码和密码登录,并使用确认码。即,这个:

const user = await Auth.signIn(this.state.phoneNumber, this.state.password)
...then...
const data = await Auth.confirmSignIn(this.state.user, this.state.confirmationCode, 'SMS_MFA');

没有任何 MFA 的无密码登录,使用 Preauthentication Lambda 触发器(显然不是一个可行的解决方案):

event.response.issueTokens = true;
event.response.failAuthentication = false;

问题: 当我尝试登录一个只发送用户名的用户帐户时:

const user = await Auth.signIn(this.state.phoneNumber)

Amplify 给出(拼写错误的)错误消息:

null failed with error Generate callenges lambda cannot be called..

即没有为用户池设置 lambda 触发器。

如果我设置了一个包含以下内容的 defineAuthChallenge 触发器:

event.response.issueTokens = true;
event.response.failAuthentication = false;

当然,它只是让我在没有 MFA 的情况下登录。但是,如果我将 issueTokens 设置为 false,则身份验证流程将失败,并且在下一页加载时我会从 amplify 中收到一个关于缺少 ID 令牌的错误。

如果我设置event.response.challengeName = 'SMS_MFA',错误就会消失,但不会发送短信,我也不会进行身份验证。

有没有办法 (a) 实际上以一种有效的方式将 SMS MFA 设置为我的“自定义挑战”? (b) 更好的是,根本不使用任何 lambda 触发器并让放大和用户池在没有密码的情况下继续运行?

就目前而言,我能看到的唯一解决方法:

手动实施 SMS MFA(不,谢谢) 客户端用户注册和登录的硬编码密码

【问题讨论】:

【参考方案1】:

我通过以下方式实现了无密码 Cognito:

    将刷新令牌过期时间设置为很长的时间 当用户注册时,生成一次性密码并使用常规 Cognito 注册 API 来创建用户 永远不要存储或向用户显示一次性密码 - 依靠 Cognito 会话刷新来保持用户“登录” 如果刷新令牌过期或出现其他问题,请滥用 Cognito 重置密码流程,向用户发送验证码并生成另一个一次性密码。

这对我们有用,但它有点老套。但是,它不依赖任何自定义触发器并使用常规 Cognito 客户端 API。虽然没有用 MFA 尝试过

【讨论】:

我明白你在说什么。但是,让我们采取以下步骤: (1.) 使用临时密码调用 Cognito signUp API (2.) 此时,用户可以是 UNCONFIRMED (3.) 用户收到验证码 (4.) 用户输入验证码 5.用户确认。现在,我们可以登录用户了。我们获取用户验证码并使用临时密码对用户进行身份验证。我们必须存储在第 1 步中生成的密码,以便在第 5 步中检索它。你是如何绕过它的?【参考方案2】:

可能有用: Password-free SMS Authentication with AWS Cognito, Lambda Node.js & ios Swift

它建议直接使用 SNS 而不是通过 Cognito 的 MFA。

【讨论】:

该链接不再可用。你有类似的吗?谢谢。

以上是关于带有 SMS MFA 的无密码 Cognito的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito - 重置用户 MFA

AWS Cognito - 启用 MFA |错误:如果配置了 SMS 角色,则无法关闭 MFA

AWS Amplify/Cognito - 一种仅在用户首次登录时设置 TOTP MFA 的方法

如何使用 AWS Cognito AmplifyAuthenticator 设置可选 MFA?

如果用户在 AWS Cognito TOTP AssociateSoftwareToken MFA 有效禁用后退出应用程序

如何在 Android 上通过 Cognito 使用生物识别登录?