使用自定义Lambda授权器时,API Gateway返回内部服务器错误的原因?
问题分析
你的自定义授权器日志显示令牌验证通过,但listUsers函数未执行且返回500错误,核心原因是Lambda请求授权器的返回格式不符合HTTP API的要求。AWS HTTP API要求请求型授权器的返回结果必须包含principalId字段,仅返回isAuthorized: true会导致API Gateway无法完成授权流程,进而抛出内部错误。
解决方案
修改authorizer.js中的返回逻辑,在验证通过/失败的情况下都添加principalId字段,值可以从JWT payload中提取或设置为标识性字符串:
const { CognitoJwtVerifier } = require('aws-jwt-verify'); const Cognito = require('../shared/Cognito'); module.exports.handler = async (event) => { const authHeader = event.headers.authorization; if (!authHeader) { console.log('No auth header'); return { isAuthorized: false, principalId: 'unauthorized' }; } const token = authHeader.split(' ')[1]; console.log(token); const verifier = CognitoJwtVerifier.create({ userPoolId: Cognito.UserPoolId, tokenUse: 'access', clientId: Cognito.ClientId, }); let payload = null; try { payload = await verifier.verify(token); console.log('Token is valid. Payload:', payload); return { isAuthorized: true, principalId: payload.sub // 使用JWT中的用户唯一ID作为principalId // 可选:添加context字段传递用户信息到后端函数 // context: { // username: payload.username, // email: payload.email // } }; } catch { console.log('Token is invalid.'); return { isAuthorized: false, principalId: 'invalid-token' }; } };
额外检查点
- 确认
serverless.yml中授权器的identitySource配置(默认值为$request.header.Authorization,符合你的场景无需修改)。 - 查看API Gateway的CloudWatch日志,搜索500相关错误条目,确认是否为返回格式问题导致的报错。
- 重新部署授权器和API服务,确保修改生效。
内容的提问来源于stack exchange,提问作者Eb3us
相关产品推荐
相关产品推荐

