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

CloudFront分发下调用API Gateway报「Missing Authentication Token」问题排查

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:23