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

基于Token的AWS自定义授权器:传递额外信息及请求头获取咨询

解决AWS自定义授权器获取请求头domain的问题

没问题,我来帮你搞定这个AWS自定义授权器获取请求头的问题!首先先提个小细节:你的前端fetch代码里有个语法错误,'domain':'faraz.com'后面少了个逗号,这会导致代码运行报错,先修正一下:

fetch(PRIVATE_ENDPOINT, { 
  method: 'POST', 
  headers: { 
    Authorization: `${token}`, 
    'domain':'faraz.com', // 补上缺失的逗号
    'Content-Type': 'application/json', 
  }, 
})

接下来重点说怎么在自定义授权器里拿到domain请求头,分两种常见的API类型来讲解:

1. 如果你用的是AWS REST API

REST API的自定义授权器Lambda会收到一个包含请求详情的event对象,所有请求头都存在event.headers里,不过要注意AWS会自动把所有请求头的键转为小写,所以你需要用小写的domain去访问:

exports.handler = async (event) => {
  const token = event.authorizationToken;
  // 获取domain请求头,用可选链避免不存在时报错
  const domain = event.headers?.domain;

  // 这里加入你的授权逻辑,比如验证token和domain的关联
  if (!token || !domain) {
    throw new Error('Unauthorized: Missing token or domain');
  }

  // 假设验证通过,返回允许访问的策略
  return {
    principalId: 'your-user-id',
    policyDocument: {
      Version: '2012-10-17',
      Statement: [
        {
          Action: 'execute-api:Invoke',
          Effect: 'Allow',
          Resource: event.methodArn
        }
      ]
    }
  };
};

2. 如果你用的是AWS HTTP API

HTTP API的自定义授权器event结构略有不同,请求头会放在event.requestContext.http.headers里,同样键是小写的:

exports.handler = async (event) => {
  const token = event.authorizationToken;
  const domain = event.requestContext.http.headers?.domain;

  // 授权逻辑...
  if (!token || !domain) {
    return {
      isAuthorized: false
    };
  }

  return {
    isAuthorized: true,
    principalId: 'your-user-id'
  };
};

关键注意事项

  • 请求头白名单配置:不管是REST还是HTTP API,都需要确保API Gateway允许domain请求头传递到授权器。对于REST API,要在控制台的对应资源的「方法请求」中,添加domain到「HTTP请求头」列表,然后重新部署API;HTTP API则需要在路由的「请求头」设置里允许该头。
  • 大小写问题:AWS会统一把请求头键转为小写,所以前端不管传Domain还是domain,Lambda里都要用domain去访问。

内容的提问来源于stack exchange,提问作者faraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:13