AWS HTTP API Gateway:IAM认证导致带请求体的请求返回403错误
核心原因是IAM签名验证要求包含请求体的哈希值:当请求带体时如果签名未正确计算这部分内容,就会触发403拒绝;不带请求体时,签名仅基于头部等信息,验证自然通过;关闭IAM认证后跳过签名校验,请求就能正常执行。
以下是具体排查和解决步骤:
检查Postman的IAM签名配置
在Postman的Authorization标签选择AWS Signature后,必须勾选Sign Request Body选项。默认情况下这个选项可能未启用,导致带请求体的请求签名缺失关键的体哈希,触发签名验证失败。同时确认:- Access Key、Secret Key正确对应Cognito用户关联的IAM角色凭证
- Region选择API Gateway所在区域
- Service Name填写
execute-api
确保请求体和Content-Type匹配
发送JSON请求体时,必须设置Content-Type: application/json,且请求体格式严格(无多余空格、换行)。IAM签名会根据Content-Type和体内容计算哈希,格式不匹配会导致哈希值不一致,验证失败。验证IAM权限的资源范围
虽然用户拥有AmazonAPIGatewayInvokeFullAccess,但要确认该权限的资源是否覆盖当前HTTP API的具体路由。比如权限策略中的资源应包含类似arn:aws:execute-api:{{region}}:{{account-id}}:{{api-id}}/{{stage}}/POST/{{path}}的ARN,避免因资源匹配不到导致的访问拒绝。查看API Gateway访问日志定位具体错误
启用API Gateway的访问日志(在HTTP API的Settings中配置CloudWatch日志组),日志中会给出403的具体错误类型:InvalidSignatureException:说明签名计算错误,重点检查请求体哈希和签名配置AccessDenied:说明权限不足,检查IAM角色的策略和信任关系
内容的提问来源于stack exchange,提问作者Paul de Koning

