AWS Lambda自定义认证报错Unrecognizable lambda output求助
AWS Lambda自定义认证(CUSTOM_AUTH)"Unrecognizable lambda output"错误排查
问题核心
用Node.js 16开发AWS Lambda自定义认证(CUSTOM_AUTH),设置固定挑战答案:
- 前端调用
cognito.adminInitiateAuth可正常获取会话令牌 - 调用
cognito.respondToAuthChallenge时触发"Unrecognizable lambda output"错误 - Lambda日志已打印
****** Correct answer provided. Issuing tokens. ******,说明挑战验证逻辑已执行,但返回格式不符合Cognito要求
排查方向与解决方案
1. 检查Lambda返回事件格式是否符合Cognito规范
Cognito对自定义认证Lambda的返回格式有严格要求,颁发令牌阶段必须包含以下结构:
{ "version": "1", // 必须是字符串"1",不能是数字 "response": { "issueTokens": true, // 布尔值,验证通过设为true "failAuthentication": false, // 布尔值,验证通过设为false "challengeParameters": {} // 无需后续挑战可留空 } }
常见错误:
- 缺少顶层
version字段 response结构嵌套错误issueTokens/failAuthentication使用非布尔值(比如字符串"true")
2. 确认Node.js 16异步返回逻辑正确
Node.js 16环境下的Lambda若使用异步函数,必须确保返回完整的Promise结果:
- 避免用回调函数而不包装为Promise,导致Lambda无法获取正确返回值
- 不要在返回语句后执行异步操作,导致返回的事件不完整
3. 确保返回内容无额外输出或语法错误
Lambda返回值必须是纯净的合法JSON:
- 不要将日志内容混入返回事件
- 检查JSON是否存在语法错误(比如多余逗号、未闭合引号)
修正后的返回逻辑示例
exports.handler = async (event) => { // 挑战验证逻辑 const isAnswerCorrect = /* 你的验证逻辑 */; if (isAnswerCorrect) { console.log("****** Correct answer provided. Issuing tokens. ******"); return { version: "1", response: { issueTokens: true, failAuthentication: false, challengeParameters: {} } }; } else { return { version: "1", response: { issueTokens: false, failAuthentication: true, challengeParameters: { errorMessage: "Incorrect answer" } } }; } };
内容的提问来源于stack exchange,提问作者Kean Allen Imam
相关产品推荐
相关产品推荐

