如何排查 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 设置。

检查资源策略

验证以下内容:

  • 如果从具有接口 VPC 终端节点的 Amazon VPC 中调用 API,则 API 的资源策略必须将 Amazon VPC 或接口终端节点访问权限授予 API。
  • 资源策略的资源规范和格式是否正确。(在保存资源策略时,不验证资源规范。) 有关示例,请参阅 API Gateway 资源策略示例

分析 API 访问日志

启用和分析 API 的访问日志以确定是否请求到达 API。

分析 HTTP 请求和响应消息

如果可以,在 Web 浏览器中重现错误,并使用浏览器的网络工具捕获 HTTP 请求和响应消息以进行分析。要进行脱机分析,请以 HTTP 存档 (HAR) 文件格式保存这些消息。

提示:有关创建 HAR 文件的说明,请参阅如何从浏览器创建 AWS Support 案例的 HAR 文件?

分析客户端和 API 之间的请求和响应,找出错误发生的位置。