带有 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/228https://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 |错误:如果配置了 SMS 角色,则无法关闭 MFA
AWS Amplify/Cognito - 一种仅在用户首次登录时设置 TOTP MFA 的方法
如何使用 AWS Cognito AmplifyAuthenticator 设置可选 MFA?
如果用户在 AWS Cognito TOTP AssociateSoftwareToken MFA 有效禁用后退出应用程序