在 AWS Cognito 中回答 NEW_PASSWORD_REQUIRED 质询后继续使用自定义身份验证流程

Posted

技术标签:

【中文标题】在 AWS Cognito 中回答 NEW_PASSWORD_REQUIRED 质询后继续使用自定义身份验证流程【英文标题】:Continue with custom auth flow after NEW_PASSWORD_REQUIRED challenge is answered in AWS Cognito 【发布时间】:2019-06-17 00:56:05 【问题描述】:

管理员创建了一个新用户。他们需要在首次登录时重置初始密码。我们将 Cognito 应用程序客户端配置为仅允许自定义身份验证流程 (CUSTOM_AUTH_FLOW_ONLY)。但是当用户重置密码时,身份验证流程结束,他们立即获得 id-、access- 和 refresh-token,不会发出任何自定义挑战。

如何引导流程继续我的自定义质询流程,而不是颁发令牌? 如果令牌在重置其初始密码后不会在响应中发送,它也会起作用,这样用户必须重新登录。

一个新用户当前正在运行此流程:

    目前,对于新用户,我们发送 InitiateAuthRequest 以及用户名和 SRP_A,AuthFlow 设置为 CUSTOM_AUTH,就像正常登录一样。 我们的 DefineAuthChallengeLambda 被命中,发出 PASSWORD_VERIFIER 质询。 客户端使用 srp 声明、用户名和时间戳来响应身份验证质询。 Cognito 验证响应并发现用户必须更改其密码。我们的 lambda 触发器被跳过,NEW_PASSWORD_REQUIRED 质询由 Cognito 返回。 客户端使用新密码响应身份验证挑战,Cognito 接受密码并颁发令牌,这不是我们想要的。

我们要么希望流程在此结束而不发出任何令牌,要么不希望在此结束并继续定义身份验证质询触发器调用。

【问题讨论】:

【参考方案1】:

于是我联系了 AWS Support 并得到了以下答复:

正如我所提到的,我们一直在与团队合作,您似乎发现了使用 Custom_Auth 的问题以及使用 Custom_Auth 和 Password_Verifier/New_Password_Required 挑战的问题。目前看来,将 Custom_auth 更改为 SRP_A 或从 SRP_A 更改并使用 New password required 质询不起作用。我们设法与 Cognito 服务团队完全复制了这一点,他们已经确认这有点坏了,我们不支持自定义身份验证来应对这些挑战。他们同意,但是我们应该从根本上支持他们,我们已将其确定为团队的功能请求,他们已将其放在优先列表中。不幸的是,我无法给出完全实施的明确时间框架。

TL;DR: 目前不完全支持带有密码验证的自定义身份验证流程。密码重置挑战打破了流程。

对我们来说,我们使用了一种解决方法:在 PreTokenGeneration lambda 触发器中,我们检查当前的身份验证流程是否来自密码重置事件。如果是这种情况,我们只是抛出一个异常并且不会发出任何令牌。异常消息是返回给客户端的,所以通过查看异常的消息内容,可以看到具体发生了什么错误。如果您看到由于密码重置而没有生成令牌,只需告诉用户:“密码成功重置”并再次将它们重定向到登录页面。从那里他们可以正常登录,完成整个自定义身份验证流程。

很遗憾,当该功能可用时,无法提供反馈。显然大多数新功能都是在here 宣布的,所以我会密切关注这一点。

【讨论】:

Cognito 确实有很多错误。我确实希望他们认真对待他们的路线图。 关于这个问题是否得到解决的任何消息?我们自己也遇到了这个错误,并试图决定是要走解决方法还是看看我们是否只是设置了错误。 @jready 仍然没有消息。我每天都在查看发布的链接,但遗憾的是什么都没有出现。 @SvenMöhring 对此有何更新?您能否提供一个 PreTokenGeneration lambda 函数的示例以及您如何知道它来自密码重置事件? @rplankenhorn 抱歉,因为我有一份新工作,所以我无法访问代码。我想我记得您可以从作为 PreTokenGeneration 触发器的输入参数提供的上下文中获取先前的挑战,如果您在其中发现密码重置挑战,您只需抛出并中止流程。很抱歉,我无法提供更多帮助。

以上是关于在 AWS Cognito 中回答 NEW_PASSWORD_REQUIRED 质询后继续使用自定义身份验证流程的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda、API 网关和 Cognito:如何在 lambda 函数中获取身份对象?

什么是用于在 Cognito 中登录的 AWS 开发工具包库(从后端不使用 Amplify)?

AWS-amplify 在请求中包含 cognito Authorization 标头

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?

AWS Cognito:在 Auth.signIn 中出现错误(验证 amazon-cognito-identity-js 是不是已链接)