如何排查 API Gateway 中的 HTTP 403 错误?

4 分钟阅读
0

当我调用 Amazon API Gateway API 时,遇到 403 错误。

简短描述

当客户端不能访问有效的 URL 时,将得到 HTTP 403 响应代码。服务器识别请求,但由于客户端问题,无法满足请求。
API Gateway API 会出于以下原因返回 403 响应:

问题响应标头错误消息根本原因
访问被拒绝"x-amzn-errortype" = "AccessDeniedException"“User is not authorized to access this resource with an explicit deny”(用户因显式拒绝,无权访问此资源)调用方无权访问使用 API Gateway 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"(用户:因显式拒绝,无权对资源:执行:execute-api:Invoke)调用方无权访问使用 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>"(用户:anonymous 无权对资源:执行:execute-api:Invoke)调用方无权访问使用 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""Forbidden"(禁止访问)调用方对需要 API 密钥的方法使用了 API 密钥,但是 API 密钥不正确。或者,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."(我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS 秘密访问密钥和签名方法。)当调用方访问使用 IAM 授权的 API 时,请求中的签名与服务器上的签名不匹配。
被 AWS WAF 筛选"x-amzn-errortype" = "ForbiddenException""Forbidden"(禁止访问)在 API 中激活 AWS WAF 时,请求被 Web 应用程序防火墙筛选阻止。
资源路径不存在"x-amzn-errortype" = "MissingAuthenticationTokenException""Missing Authentication Token"(身份验证令牌缺失)不含“Authorization”标头的请求发送到了不存在的 API 资源路径。有关详细信息,请参阅如何对 API Gateway REST API 端点 403“Missing Authentication Token”(身份验证令牌缺失)错误进行故障排除?
资源路径不存在"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"(禁止访问)您错误地在 Amazon Virtual Private Cloud (Amazon VPC) 中使用公有 DNS 名称调用私有 API。例如:请求中缺少**“Host”“x-apigw-api-id”**标头。有关详细信息,请参阅使用特定于端点的公有 DNS 主机名调用私有 API
使用默认 execute-api 端点调用具有自定义域名的 REST API"x-amzn-errortype" = "ForbiddenException""Forbidden"(禁止访问)在您停用默认端点后,调用方使用默认的 execute-api 端点调用 REST API。有关详细信息,请参阅禁用 REST API 的默认端点
使用无效的客户端证书调用需要双向 TLS 的 API Gateway 自定义域名"x-amzn-errortype" = "ForbiddenException""Forbidden"(禁止访问)自定义域名的信任库没有颁发 API 请求中的客户端证书,或者该证书无效。有关详细信息,请参阅如何对来自需要双向 TLS 的 API Gateway 自定义域名的 HTTP 403 Forbidden(HTTP 403 禁止访问)错误进行故障排除?
调用没有基本路径映射的自定义域名"x-amzn-errortype" = "ForbiddenException""Forbidden"(禁止访问)调用方调用自定义域,但没有将基本路径映射到 API。有关详细信息,请参阅 API Gateway 中 REST API 的自定义域名
调用启用自定义域的 API 时,域 URL 包含阶段"x-amzn-errortype" = "MissingAuthenticationTokenException""Missing Authentication Token"(身份验证令牌缺失)API 映射指定 API、阶段以及用于映射的可选路径。因此,当 API 的阶段映射到自定义域时,您不再需要在 URL 中包含该阶段。有关详细信息,请参阅将 API 阶段映射到 REST API 的自定义域名
请求 URL 中的阶段无效"x-amzn-errortype" = "ForbiddenException""Forbidden"调用方的请求 URL 包含一个不存在的阶段。有关详细信息,请参阅在 API Gateway 中调用 REST API

解决方法

确定错误原因

如果从其他资源(例如以下示例)报告了 403 错误,则该错误可能还有其他原因:

  • 如果在 Web 浏览器中报告了错误,则不正确的代理设置可能不允许 HTTP 访问。
  • 如果 API 前面有其他 AWS 服务,例如 Amazon CloudFront,则拒绝请求的可能是该服务。

要确定错误的原因,请为您的 API 设置 Amazon CloudWatch 访问日志记录。然后,在 CloudWatch 中查看 API 的日志事件,以确定请求是否到达 API。

注意:HTTP API 不支持执行日志记录

要对由需要双向 TLS 并调用 HTTP API 的自定义域名返回的 403 错误进行故障排除,请完成以下操作:

  1. 创建新的 API 映射以测试自定义域名的 REST API 调用。
  2. 要确定错误的原因,请在 CloudWatch 中查看 REST API 的日志事件。
  3. 识别并解决错误后,将 API 映射重新路由到 HTTP API。

确认请求的资源存在于 API 定义中

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保使用的是最新版本的 AWS CLI

使用 API Gateway 控制台或 AWS CLI 验证以下配置:

  • 部署 API 时使用最新的 API 定义。
  • 请求的资源存在于 API 定义中。

使用 curl 获取请求和响应详细信息

如果可以重现错误,可使用 curl -v 命令获取客户端和 API 之间的更多详细信息:

curl -X HTTP_VERB -v https://{api_id}.execute-api.{region}.amazonaws.com/{stage_name}/{resource_name}

验证请求标头是否正确

如果错误是由无效的 API 密钥导致,则验证是否在请求中发送了**“x-api-key”**标头。如果标头未包含或不正确,请更新请求标头。

验证 Amazon VPC 接口端点上的 DNS 设置是否正确设置

**注意:**以下任务适用于您从只有 VPC 接口端点的 Amazon VPC 调用的 API。

根据您使用的 API 类型,验证接口端点的 DNS 设置是否正确。

要从 Amazon VPC 内部调用区域 API,请在接口端点上停用私有 DNS 名称。这样,公有 DNS 就可以解析端点的主机名。有关详细信息,请参阅创建私有 API

要使用 API 的私有 DNS 名称从 Amazon VPC 内部调用私有 API,请在端点上激活私有 DNS 名称。然后,Amazon VPC 本地子网资源可以解析接口端点的主机名。

**注意:**如果您使用以下任一选项调用私有 API,则无需设置私有 API 的公共 DNS 名称Amazon Route 53 别名

查看 API 的资源策略

查看 API 的资源策略以验证以下配置:

查看 HTTP 请求和响应消息

在 Web 浏览器中重现错误。使用浏览器的网络工具捕获 HTTP 请求和响应消息,并对其进行分析以确定错误发生的位置。

**注意:**要进行离线分析,请以 HTTP 归档 (HAR) 文件格式保存消息。

相关信息

常见错误

如何只允许特定的 IP 地址访问我的 API Gateway REST API?

如何对连接至 API Gateway 私有 API 端点时出现的问题进行故障排除?

如何启用 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行故障排除?

curl 网站上的 curl 项目