Aws lambda 带SMS MFA的无密码Cognito

Aws lambda 带SMS MFA的无密码Cognito,aws-lambda,amazon-cognito,aws-amplify,Aws Lambda,Amazon Cognito,Aws Amplify,首先,我们看到: :此解决方案似乎设计过度,在dynamodb中生成、存储、引用用户密码或手动实现SMS MFA 当然,这些都是很好的例子Buggy@Github超过: 然而,到目前为止,我看到的所有无密码流似乎也使用自定义身份验证,如captcha。我正在寻找使用AWS的内置短信MFA,否则一直为我工作的伟大 使用: 放大 反应(香草) 有效的东西: 使用电话号码和密码以及确认码登录。也就是说,这个: const user = await Auth.signIn(this.st

首先,我们看到:

  • :此解决方案似乎设计过度,在dynamodb中生成、存储、引用用户密码或手动实现SMS MFA

当然,这些都是很好的例子Buggy@Github超过:

然而,到目前为止,我看到的所有无密码流似乎也使用自定义身份验证,如captcha。我正在寻找使用AWS的内置短信MFA,否则一直为我工作的伟大

使用:

  • 放大
  • 反应(香草)
有效的东西:

  • 使用电话号码和密码以及确认码登录。也就是说,这个:

    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,使用预验证Lambda触发器(显然不是可行的解决方案):

问题是: 当我尝试登录用户帐户时,仅发送用户名,如下所示:

const user = await Auth.signIn(this.state.phoneNumber)
放大给出(拼写错误)错误消息:

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(不,谢谢)
  • 客户端用户用于注册和登录的硬代码密码

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

  • 将刷新令牌过期时间设置为非常长的时间
  • 当用户注册时,生成一个一次性密码,并使用常规的Cognito注册API创建用户
  • 永远不要存储或向用户显示一次性密码-依靠Cognito会话刷新来保持用户“登录”
  • 如果刷新令牌过期或出现其他问题,则通过向用户发送验证码并生成另一个一次性密码来滥用Cognito重置密码流
  • 这对我们来说很有效,但有点粗糙。然而,它不依赖于任何自定义触发器,而是使用常规的Cognoto客户端API。没有尝试过使用MFA,但

    可能有用:


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

    该链接不再可用。有类似的吗?谢谢。我明白你在说什么。但是,让我们采取以下步骤:(1)使用临时密码调用Cognito注册API(2)。此时,用户可能未经确认(3)。用户收到验证码(4)。用户输入验证码5。用户被确认。现在,我们可以登录用户了。我们使用用户验证码并使用临时密码对用户进行身份验证。我们必须存储在步骤#1中生成的密码,才能在步骤#5中检索它。你怎么能绕过它?
    event.response.issueTokens = true;
    event.response.failAuthentication = false;