使用SMS MFA进行无密码的Cognito

时间:2018-09-20 02:56:46

标签: aws-lambda amazon-cognito aws-amplify

首先,您已经看到:

绝对是Buggy @ Github的优秀示例,网址为: https://github.com/buggy/project-x-server/tree/master/shopify/src

但是,到目前为止,我所看到的所有无密码流似乎也使用了自定义身份验证,例如验证码。我正在使用AWS的内置SMS 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');
    
  • 使用预身份验证Lambda触发器(显然不是可行的解决方案),无需任何MFA即可进行无密码登录:

    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,则身份验证流程将失败,并且在下一页加载时放大会提示我缺少ID令牌。

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

有没有办法 (a)实际上以一种可行的方式将SMS MFA设置为我的“自定义挑战”? (b)更好,是根本不使用任何lambda触发器并进行放大,并且用户池中没有密码吗?

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

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

2 个答案:

答案 0 :(得分:0)

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

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

这对我们有用,但是有点hacky。但是,它不依赖任何自定义触发器,而是使用常规的Cognito客户端API。尚未在MFA上尝试过

答案 1 :(得分:0)

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

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