如何排查 API Gateway 中的 HTTP 403 禁止访问错误?
上次更新时间:2020 年 8 月 10 日
当我调用 Amazon API Gateway API 时,遇到 403 禁止访问错误。如何排查此错误?
简短描述
HTTP 403 响应代码意味着禁止客户端访问有效的 URL。服务器获知请求,但由于客户端问题,无法满足请求。
API Gateway API 返回 403 禁止访问响应的原因有多种:
问题 | 响应标头 | 错误消息 | 详细信息 |
---|---|---|---|
访问遭拒 | "x-amzn-ErrorType" = "AccessDeniedException" | "User is not authorized to access this resource with an explicit deny" | 调用方无权访问使用 Lambda 授权方的 API。 |
访问遭拒 | "x-amzn-ErrorType" = "AccessDeniedException" | "User: <user-arn> is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny" | 调用方无权访问使用 AWS Identity and Access Management (IAM) 授权的 API。或者,API 的附加资源策略显式拒绝了调用方的访问。 有关更多信息,请参阅 IAM 身份验证和资源策略。 |
访问遭拒 | "x-amzn-ErrorType" = "AccessDeniedException" | "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>" | 调用方无权访问使用 IAM 授权的 API。或者,API 的附加资源策略未显式允许调用方调用 API。 有关更多信息,请参阅 IAM 身份验证和资源策略。 |
访问遭拒 | "x-amzn-ErrorType" = "AccessDeniedException" | "The security token included in the request is invalid." | 调用方使用无效的 IAM 密钥访问使用 IAM 授权的 API。 |
缺少身份验证令牌 | "x-amzn-ErrorType" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | 在请求中没有找到身份验证令牌。 |
身份验证令牌已过期 | "x-amzn-ErrorType" = "InvalidSignatureException" | "Signature expired" | 请求中的身份验证令牌已过期。 |
API 密钥无效 | "x-amzn-ErrorType" = "ForbiddenException" | "Invalid API Key identifier specified" | 调用方对需要 API 密钥的方法使用了无效的 API 密钥。 |
签名无效 | "x-amzn-ErrorType" = "InvalidSignatureException" | "The request signature we calculated does not match the signature you provided.Check your AWS Secret Access Key and signing method." | 当访问使用 IAM 授权的 API 时,请求中的签名与服务器上的签名不匹配。 |
已筛选 AWS WAF | "x-amzn-ErrorType" = "ForbiddenException" | "Forbidden" | 当在 API 中启用 AWS WAF 时,请求被 Web 应用程序防火墙 (WAF) 筛选阻止。 |
资源路径不存在 | "x-amzn-ErrorType" = "MissingAuthenticationTokenException" | "Missing Authentication Token" | 没有“授权”标头的请求发送到了不存在的 API 资源路径。 |
资源路径不存在 | "x-amzn-ErrorType" = "IncompleteSignatureException" | "Authorization header requires 'Credential' parameter.Authorization header requires 'Signature' parameter.Authorization header requires 'SignedHeaders' parameter.Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header.Authorization=allow" | 包含“Authorization”标头的请求发送到了不存在的 API 资源路径。 |
使用公有 DNS 名称错误调用私有 API |
"x-amzn-ErrorType" = "ForbiddenException" | "Forbidden" | 当使用公有 DNS 名称调用 Amazon Virtual Private Cloud (Amazon VPC) 中的私有 API 时,请求中会缺少“Host”或“x-apigw-api-id”标头。 有关更多信息,请参阅使用特定于终端节点的公有 DNS 主机名调用您的私有 API。 |
解决方法
执行以下问题排查步骤来帮助确定错误的原因。
考虑错误的根源
如果其他资源报告了 403 错误,说明可能存在导致该错误的其他原因。例如:
- 如果在 Web 浏览器中报告了错误,则可能是由于代理设置不正确所致。如果不允许 HTTP 访问,代理服务器会返回 403 错误。
- 如果 API 前面有其他 AWS 服务(例如 Amazon CloudFront),该服务可能会拒绝请求并在响应中包含 403 错误。
启用 API 访问日志记录以便进行调查。
确认请求的资源存在于 API 定义中
使用 API Gateway 控制台或 AWS 命令行界面 (AWS CLI) 检查 API 中是否包含请求的资源。
注意:部署 API 时必须使用最新的 API 定义。
使用 curl 获取请求和响应详细信息
如果可以重现此错误,您可以使用 curl -v 获取客户端与 API 之间的更多详细信息。例如:
curl -X GET -v https://apiId.execute-api.region.amazonaws.com/stageName/resourceName
如需关于 curl 的更多信息,请参见 curl 项目网站。
检查标头
如果错误与 API 密钥有关,请验证是否在请求中发送了“x-api-key”标头。
检查 VPC 终端节点上的 DNS 设置
如果从具有接口 VPC 终端节点的 Amazon VPC 中调用 API,请验证是否根据 API 类型正确设置了接口终端节点的 DNS 设置。
- 要从 Amazon VPC 内部调用区域 API,必须在接口终端节点上禁用私有 DNS。然后,终端节点的主机名可以通过公有 DNS 解析。有关更多信息,请参阅我从 VPC 连接到 API Gateway API 时,为什么会收到 HTTP 403 禁止错误?
- 要使用 API 的私有 DNS 名称从 Amazon VPC 内部调用私有 API,必须在接口终端节点上启用私有 DNS。然后,接口终端节点的主机名可以解析为 Amazon VPC 的本地子网资源。有关更多信息,请参阅如何调用私有 API。
注意:如果使用私有 API 的公有 DNS 名称或 Amazon Route 53 别名对其进行调用,则不需要启用私有 DNS。
检查资源策略
验证以下内容:
- 如果从具有接口 VPC 终端节点的 Amazon VPC 中调用 API,则 API 的资源策略必须将 Amazon VPC 或接口终端节点访问权限授予 API。
- 资源策略的资源规范和格式是否正确。(在保存资源策略时,不验证资源规范。) 有关示例,请参阅 API Gateway 资源策略示例。
分析 API 访问日志
启用和分析 API 的访问日志以确定是否请求到达 API。
分析 HTTP 请求和响应消息
如果可以,在 Web 浏览器中重现错误,并使用浏览器的网络工具捕获 HTTP 请求和响应消息以进行分析。要进行脱机分析,请以 HTTP 存档 (HAR) 文件格式保存这些消息。
提示:有关创建 HAR 文件的说明,请参阅如何从浏览器创建 AWS Support 案例的 HAR 文件?
分析客户端和 API 之间的请求和响应,找出错误发生的位置。