You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Cognito自定义OTP认证重试报错:Authentication result expected

AWS Cognito自定义OTP认证重试报错"Authentication result expected"的解决办法

你的问题出在defineAuthChallenge触发器的逻辑覆盖不全,以及重试场景下的响应规则处理错误。

问题根源

  1. 原代码仅处理了session长度为0和1的场景,当用户第二次重试(session长度变为2)时,没有对应的逻辑分支,导致Cognito无法识别下一步操作,抛出"Authentication result expected"错误。
  2. 固定判断session[0]的挑战结果,而非最近一次的挑战结果,逻辑存在偏差。

修正后的defineAuthChallenge代码

async function defineAuthChallengeLambda(event) {
  const session = event.request.session;
  // 可根据业务需求调整最大重试次数
  const maxAllowedAttempts = 3;

  if (session.length === 0) {
    // 首次发起OTP挑战
    event.response.failAuthentication = false;
    event.response.issueTokens = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else {
    // 取最近一次的挑战结果进行判断
    const lastChallengeSuccess = session[session.length - 1].challengeResult;
    
    if (lastChallengeSuccess) {
      // 最近一次验证通过,发放认证令牌
      event.response.failAuthentication = false;
      event.response.issueTokens = true;
    } else {
      if (session.length < maxAllowedAttempts) {
        // 还有重试次数,重新发起挑战
        event.response.failAuthentication = false;
        event.response.issueTokens = false;
        event.response.challengeName = "CUSTOM_CHALLENGE";
      } else {
        // 重试次数耗尽,认证失败
        event.response.failAuthentication = true;
        event.response.issueTokens = false;
      }
    }
  }
  return event;
}

配套触发器的关键逻辑检查

确保另外两个触发器的逻辑正确,避免验证码缓存或验证错误:

  1. createAuthChallenge:每次发起挑战时生成新验证码,并存储到privateChallengeParameters(仅Cognito内部可见),同时发送验证码到用户手机号:
async function createAuthChallengeLambda(event) {
  // 生成6位随机验证码
  const otpCode = Math.floor(100000 + Math.random() * 900000).toString();
  // 替换为你的短信发送逻辑(如调用AWS SNS)
  await sendVerificationSMS(event.request.userAttributes.phone_number, otpCode);

  event.response.privateChallengeParameters = { code: otpCode };
  event.response.challengeMetadata = "OTP_CHALLENGE";
  return event;
}
  1. verifyAuthChallengeResponse:仅对比当前挑战的验证码,不使用缓存值:
async function verifyAuthChallengeResponseLambda(event) {
  const expectedCode = event.request.privateChallengeParameters.code;
  const userInputCode = event.request.challengeAnswer;

  event.response.answerCorrect = userInputCode === expectedCode;
  return event;
}

为什么原代码会报错?

当用户第一次输错验证码后,session长度变为1且challengeResult为false,你的代码返回重新发起挑战;但用户第二次调用RespondToAuthChallenge时,session长度变为2,原代码没有处理该场景,Cognito无法确定是继续挑战、发放令牌还是拒绝认证,因此抛出"Authentication result expected"错误。

内容的提问来源于stack exchange,提问作者Roman Mahotskyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:30:28