AWS Cognito自定义OTP认证重试报错:Authentication result expected
AWS Cognito自定义OTP认证重试报错"Authentication result expected"的解决办法
你的问题出在defineAuthChallenge触发器的逻辑覆盖不全,以及重试场景下的响应规则处理错误。
问题根源
- 原代码仅处理了session长度为0和1的场景,当用户第二次重试(session长度变为2)时,没有对应的逻辑分支,导致Cognito无法识别下一步操作,抛出"Authentication result expected"错误。
- 固定判断
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; }
配套触发器的关键逻辑检查
确保另外两个触发器的逻辑正确,避免验证码缓存或验证错误:
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; }
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
相关产品推荐
相关产品推荐

