开启Lambda集成后Serverless Auth接口无法获取idToken和accessToken
API Gateway Lambda集成获取POST Payload 问题解决
核心原因是API Gateway的Lambda集成会对请求结构做包装,和普通HTTP服务的req.body结构不一样,以下是具体解决方案:
1. 适配Lambda代理集成的事件结构
如果你的Serverless配置用的是默认的Lambda代理集成(lambda-proxy),API Gateway会把POST请求的payload放在event.body字段里,而且是JSON字符串格式,必须手动解析才能拿到参数:
修改Lambda处理代码:
exports.handler = async (event) => { // 解析JSON格式的请求体 const requestBody = JSON.parse(event.body); const { idToken, accessToken } = requestBody; // 打印参数验证 console.log('idToken:', idToken); console.log('accessToken:', accessToken); // 后续业务逻辑... return { statusCode: 200, body: JSON.stringify({ result: 'success' }) }; };
2. 非代理集成配置映射模板
如果使用非代理Lambda集成,需要在serverless.yml中配置API Gateway映射模板,直接把请求payload的字段映射到Lambda的输入参数:
serverless.yml 配置示例
service: auth-service functions: authHandler: handler: src/auth.handler events: - http: path: auth method: post integration: lambda request: templates: application/json: | { "idToken": "$input.json('$.idToken')", "accessToken": "$input.json('$.accessToken')" }
对应的Lambda处理代码
exports.handler = async (event) => { // 直接从event中获取映射后的参数 const { idToken, accessToken } = event; console.log('idToken:', idToken); console.log('accessToken:', accessToken); // 后续业务逻辑... return { statusCode: 200, body: JSON.stringify({ result: 'success' }) }; };
额外排查要点
- 确认请求的
Content-Type头部是application/json,如果是form-data或x-www-form-urlencoded,需要调整解析逻辑或映射模板。 - 查看CloudWatch日志里的完整
event对象,确认请求payload是否被正确传递(比如是否存在event.body,或者是否有其他嵌套结构)。 - 检查Serverless框架版本,部分旧版本的集成配置逻辑可能有差异。
内容的提问来源于stack exchange,提问作者karPower
相关产品推荐
相关产品推荐

