错误:需要身份验证结果(自定义流程)

问题描述 投票:0回答:1

我正在尝试使用 AWS Cognito 实施 OTP 身份验证。这是身份验证的流程:

  1. 用户提供他们的电话号码。
  2. AWS 向用户的电话号码发送验证码。
  3. 用户输入验证码。
  4. 认证完成。完成。

我按照 AWS 文档并配置了三个 AWS Cognito 触发器:

defineAuthChallenge
createAuthChallenge
verifyAuthChallengeResponse

一切正常。然而,如果用户第一次输入错误的验证码,然后发送正确的代码,

verifyAuthChallengeResponse
似乎会“缓存”错误的代码结果并不断失败。我还尝试遵循社区指南,该指南建议在尝试失败时从
defineAuthChallenge
返回以下响应:

async function defineAuthChallengeLambda(event) {
  if (event.request.session.length === 0) {
    // [CASE-1] If no session, it means the user is authenticating for the first time
    event.response.failAuthentication = false;
    event.response.issueTokens = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (event.request.session.length === 1) {
    if (event.request.session[0].challengeResult === true) {
      // [CASE-2] If the user answered correctly -> authenticated
      event.response.failAuthentication = false;
      event.response.issueTokens = true;
    } else {
      // [CASE-3] If the user didn't answer correctly -> repeat the flow again (!!!)
      event.response.challengeName = "CUSTOM_CHALLENGE";
      event.response.failAuthentication = false;
      event.response.issueTokens = false;
    }
  }
  return event;
}

[CASE-3]是社区提出的,但每当这种情况发生时,我触发第二次身份验证尝试的命令就会失败并出现错误(请参阅下面的代码):

import { RespondToAuthChallengeCommand } from "@aws-sdk/client-cognito-identity-provider"

const command = new RespondToAuthChallengeCommand({
  ClientId: envs.IL_USER_POOL_CLIENT_ID,
  ChallengeName: "CUSTOM_CHALLENGE",
  ChallengeResponses: {
    USERNAME: bag.phoneNumber,
    ANSWER: bag.code
  },
  Session: bag.session,
})

await new CognitoIdentityProvider().send(command) // Error: Authentication result expected

第二次尝试似乎期望

event.response.failAuthentication = true
event.response.issueTokens = true
,但这两种情况对于第二次重试都无效。

你知道我做错了什么吗?”

amazon-cognito
1个回答
0
投票

我必须承认我在逻辑上犯了一个错误,出现的错误是由于我定义的自定义错误造成的。不过,我也找到了解决方案。

每当我调用

RespondToAuthChallengeCommand
时,该命令的结果都会包含一个会话属性,以防代码验证失败。因此,我必须获取这个返回的字符串并将其再次传递给下一个请求。完成此操作后,流程开始按预期工作。
defineAuthChallenge
触发器开始接收多个会话,包括失败的验证,允许我实施多次重试。

换句话说,在我之前的实现中,我对所有代码尝试都使用了 Session 属性,这是不正确的。现在,每当失败时,我都会从

RespondToAuthChallengeCommand
检索新的会话字符串,并将其传递给下一次尝试(请求)。

© www.soinside.com 2019 - 2024. All rights reserved.