如何在带JWT鉴权的AWS API Gateway + Lambda中自定义客户端请求
问题排查&实现方案
首先解决event.headers返回undefined的问题:先打印完整的event对象确认结构,不同的Lambda触发器(API Gateway REST API/HTTP API/ALB)的event结构差异很大:
- 若使用API Gateway V2版本payload,请求头默认在
event.headers字段 - 若使用旧版REST API或未开启头传递,请求头可能存储在
event.multiValueHeaders字段 - 先到触发器配置页确认是否开启了「原始请求头传递」开关,未开启的话请求头会被过滤
方案1:使用Lambda Authorizer(官方推荐)
这是AWS生态下最适配该需求的原生方案:
- 将现有JWT验证逻辑抽为独立的Lambda Authorizer(自定义授权方),绑定到API Gateway对应路由
- 验证通过后,在返回值的
context字段中加入JWT解码后的用户信息,API Gateway会自动将所有context字段转换为X-Amzn-Authorizer-*前缀的请求头,直接透传给下游服务 - 授权方返回示例:
{ "principalId": "user_12345", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:*:*:*/*/*/*" } ] }, "context": { "userId": "12345", "userRole": "admin", "userEmail": "user@example.com" } }
下游服务无需再次解析JWT,直接读取对应请求头即可获取用户信息。
方案2:业务Lambda直接透传
如果不想拆分现有JWT验证逻辑,可以在业务Lambda中手动添加自定义头后再转发请求到下游:
- 解析JWT得到用户信息后,在转发请求的头信息中添加
X-前缀的自定义字段,避免和标准头冲突 - Node.js示例代码:
// 提取并验证JWT const token = event.headers.authorization.split(' ')[1] const decodedUser = verifyJWT(token) // 转发请求到下游,附加自定义头 const downstreamResponse = await fetch('https://your-backend-service.com/api', { method: event.requestContext.http.method, headers: { ...event.headers, 'X-User-Id': decodedUser.userId, 'X-User-Role': decodedUser.role }, body: event.body })
注意:如果用API Gateway代理集成,需要在集成配置中添加你自定义的头到允许传递列表,否则会被网关自动过滤。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

