基于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
相关产品推荐
相关产品推荐

