API Gateway调用AppSync时如何仅使用Cognito id_token而非IAM签名?
解决方案:让API Gateway仅传递Cognito id_token调用AppSync,不使用IAM签名
核心结论
完全可以实现,只需调整API Gateway的集成配置,禁用IAM签名并确保请求头正确传递,让AppSync优先识别用户的Cognito id_token。
具体操作步骤
修改API Gateway集成的认证类型
- 进入AWS控制台的API Gateway服务,找到目标API并定位到
/graphql对应的方法 - 切换到「集成请求」标签页,找到「集成认证类型」设置
- 将默认的「AWS IAM」改为「无」,同时移除已配置的集成IAM角色(如果有)
- 此操作会阻止API Gateway自动生成IAM签名及相关请求头
- 进入AWS控制台的API Gateway服务,找到目标API并定位到
调整请求头映射,避免冲突
- 在「集成请求」的「HTTP头」映射区域,保留已有的
Authorization = method.request.header.Authorization映射规则 - 添加两个额外的头映射,清空API Gateway可能自动添加的IAM相关头:
X-Amz-Security-Token = ''(设置为空字符串)X-Amz-Date = ''(设置为空字符串)
- 确认没有其他会覆盖
Authorization头的映射规则
- 在「集成请求」的「HTTP头」映射区域,保留已有的
确认AppSync的认证配置
- 进入AppSync控制台,检查目标API的「认证」设置
- 确保已启用「Cognito用户池」认证模式,且配置的用户池与当前使用的Cognito User Pool一致
- 不要开启「强制IAM认证」,保证AppSync可以接受Cognito id_token作为认证凭证
部署并测试
- 返回API Gateway,将API部署到对应的阶段
- 使用之前验证有效的Cognito id_token,调用API Gateway的
/graphql端点,验证请求是否正常返回结果
问题原因说明
API Gateway默认调用AWS内部服务(如AppSync)时,会自动触发IAM签名机制,添加Authorization(IAM签名内容)、X-Amz-Date、X-Amz-Security-Token等请求头。AppSync接收到这些头后,会优先尝试IAM认证流程,从而忽略你通过映射传递的用户Cognito id_token——这就是直接调用AppSync正常,但通过API Gateway转发就出现UnauthorizedException的核心原因。
通过禁用集成的IAM认证并清空相关自动添加的头,AppSync就会按照预期处理你传递的Authorization头里的id_token。
内容的提问来源于stack exchange,提问作者Gigs
相关产品推荐
相关产品推荐

