是否可以使用 AWS Cognito 实施升级身份验证?

Is it possible to implement step-up authentication using AWS Cognito?

我正在试验 AWS Amplify - 以及整个 AWS 基础设施 - 以确定它是否支持我需要为客户实施的特定工作流程。

想法是让用户通过 email/password 进行身份验证(使用 Cognito 用户池,而不是 federated/openId 登录),并且 需要升级当用户需要访问敏感信息或工具时使用 MFA(类似于 Auth0 guide 对此的解释)。

换句话说:我不想总是要求用户在登录后立即确认他们的登录。大多数会话(用户应该能够read/update data!) 根本不需要这个。只有某些操作要求用户为其帐户提供 MFA 验证。

需要注意的是,我需要能够在两种情况下(已确认登录、未确认登录)和 AWS 的其他部分与(例如)DynamoDB 进行交互。

这个可以实现吗?也许使用 AWS Lambda?

据我所知,截至目前,这在 AWS amplify 上还不能作为配置选项使用。

我实现它的方式是 Cognito 自定义身份验证流程。我没有测试这套高级指令 - 如果我遗漏了什么,请多多包涵。

场景 1:常规身份验证:仅利用基于 Amplify Auth 和 Cognito 密码的身份验证。

场景 2:在客户旅程的某个时刻,您的应用程序需要更高级别的身份验证。

在此阶段,客户端应用程序将触发自定义身份验证流程。这涉及切换身份验证流程(如此处所述 https://docs.amplify.aws/lib/auth/switch-auth/q/platform/js)并且可能在 awsconfigure.json 文件

中有多个流程

切换后,您的客户端应用程序可以触发第二个身份验证流程(自定义流程),如此处所述https://docs.amplify.aws/lib/auth/switch-auth/q/platform/js#custom_auth-flow

自定义身份验证会要求客户端应用程序提供有效的 JWT 令牌(您从场景 1 中获得的令牌)和额外的 OTP。这将确保只有经过正确身份验证的用户才能提交 OTP。

要实施该流程,您需要一个 AWS Lambda 函数。 Lambda 函数将实施质询协商的各个阶段,并验证提供的凭据(JWT 令牌和 OTP)。整个过程记录在这里 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-define-auth-challenge.html

这是我在 Python 中实现的自定义身份验证示例以及 Swift 中的相应客户端代码 https://gist.github.com/sebsto/6f5d9caf60c3db40ac245c1a9bb42b87

这并没有完全实现您的用例,但它应该足够接近开始。