You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:27:04