viewer-request阶段Lambda@Edge重定向至API Gateway报Missing Authentication Token问题咨询
问题排查与修复方案
现有实现是否正确
核心思路(根据host识别租户、查询租户对应API端点后重定向)是可行的,但存在代码逻辑漏洞和配置缺失,是触发Missing Authentication Token报错的直接原因。
报错根因
API Gateway返回该报错的核心原因是请求无法匹配到有效且允许访问的路由,对应到你的场景具体为以下几种可能:
- 重定向路径拼接错误:你当前用
data.Item.api + uri手动拼接路径,很容易出现两类问题:- DynamoDB存储的
api字段未携带API Gateway的阶段前缀(API Gateway默认端点格式为https://<id>.execute-api.<region>.amazonaws.com/<stage>/,如果只存到域名部分,拼接后路径会缺少阶段名,路由匹配失败) - 拼接时出现重复斜杠,比如
api末尾已经带/,uri开头也带/,最终生成//格式的无效路径
- DynamoDB存储的
- API Gateway未开放匿名访问:如果你的API Gateway开启了IAM认证、API Key校验或自定义授权器,客户端重定向后发起的请求未携带对应认证凭证,就会被拦截返回该报错
- 部分极端情况是Lambda@Edge没有DynamoDB读取权限,查询不到租户对应的API地址,返回的异常响应被错误解析为API Gateway的返回
需要补充的配置与代码修正
- 代码修正
- 替换手动拼接路径的逻辑,使用URL构造方法自动处理路径格式问题:
const targetUrl = new URL(request.uri, data.Item.api).href // 把location值替换为targetUrl即可 - 增加DynamoDB查询异常的日志输出,方便排查权限类问题
- 替换手动拼接路径的逻辑,使用URL构造方法自动处理路径格式问题:
- 配置修正
- 确认DynamoDB中存储的
api字段是完整的、带阶段名的API Gateway端点地址 - 如果希望客户端直接访问API Gateway,将对应API路由的授权方式设置为
NONE,关闭不必要的认证校验;如果需要保留认证,要确保客户端请求会自动携带符合要求的认证凭证 - 确认API Gateway的对应路由已经部署到指定阶段,路径规则和用户请求的
uri匹配 - 给Lambda@Edge的执行角色添加
dynamodb:GetItem权限,同时确保DynamoDB表和Lambda@Edge的部署区域一致(Lambda@Edge默认在us-east-1部署,跨区域调用DynamoDB需要额外配置)
- 确认DynamoDB中存储的
可选优化:如果不想把API Gateway直接暴露给客户端,可以不用返回302重定向,改为在Lambda@Edge中直接修改请求的目标域名和路径,由CloudFront转发请求到API Gateway,同时可以在Lambda侧统一注入API Gateway需要的认证信息,安全性更高。
内容的提问来源于stack exchange,提问作者Fernando Santiago
相关产品推荐
相关产品推荐

