CloudFront分发下调用API Gateway报「Missing Authentication Token」问题排查
我帮你分析下,这个问题大概率是CloudFront的路径转发配置错误导致的——API Gateway返回这个错误很多时候是因为它找不到你请求的资源路径,不一定真的是认证token缺失。
先拆解你的配置逻辑:
- CloudFront的
CacheBehaviors里,PathPattern设为api/*,用来匹配所有以api/开头的请求 - 对应的
rest-api-origin配置了OriginPath: /prod,意味着CloudFront会自动给请求路径加上/prod前缀,再转发给API Gateway
举个实际请求的例子:当你用自定义域名访问https://promptdash.com/api/get-data时,CloudFront实际转发给API Gateway的路径会变成/prod/api/get-data,但你的API Gateway prod阶段的资源路径应该是/prod/get-data对吧?多出来的/api前缀让API Gateway找不到对应的资源,所以返回了「Missing Authentication Token」错误。而你直接用amazonaws.com域名调用时,路径是https://xxx.execute-api.region.amazonaws.com/prod/get-data,路径完全匹配,所以能正常工作。
接下来给你两个可行的解决方案:
方案一:用Lambda@Edge重写请求路径(推荐)
创建一个Origin Request类型的Lambda@Edge函数,把请求路径中的/api前缀去掉,再转发给API Gateway。示例代码如下:
exports.handler = async (event) => { const request = event.Records[0].cf.request; // 将 /api/xxx 格式的路径替换为 /xxx request.uri = request.uri.replace(/^\/api/, ''); return request; };
然后在CloudFront的CacheBehaviors配置中,给api/*这个行为关联这个Lambda@Edge函数(触发类型选Origin Request)。同时保持rest-api-origin的OriginPath: /prod不变,这样最终转发到API Gateway的路径就会是/prod/get-data,和直接调用API Gateway的路径完全一致。
方案二:调整CloudFront路径匹配规则(无需Lambda)
如果不想用Lambda@Edge,可以修改CloudFront配置逻辑:
- 把
rest-api-origin的OriginPath改为空字符串 - 在API Gateway的prod阶段,把资源路径统一加上
/api前缀(比如原本的/get-data改成/api/get-data)
这样CloudFront转发/api/get-data时,直接转发到API Gateway的/prod/api/get-data,就能匹配到对应的资源。不过这个方案需要修改API Gateway的资源路径,灵活性不如方案一。
另外还有个细节建议:你的ForwardedValues里Headers是空数组,建议把Host头部加入转发列表,虽然不是这次问题的核心,但有时候API Gateway需要正确的Host头部来处理请求:
ForwardedValues: QueryString: false Headers: - Host
按照上面的方案调整后,应该就能解决自定义域名调用API的问题了。
内容的提问来源于stack exchange,提问作者Ava

