如何對 API Gateway 的「HTTP 403 禁止」錯誤進行疑難排解?

上次更新日期: 2021 年 5 月 19 日

當我呼叫 Amazon API Gateway API 時,我收到「403 禁止」錯誤。我該如何對此錯誤進行疑難排解?

簡短描述

HTTP 403 回應程式碼表示禁止用戶端存取有效 URL。伺服器已了解請求,但由於用戶端問題而無法滿足請求。

API Gateway API 可出於以下任何原因傳回「403 禁止」回應:

Issue Response header 錯誤訊息 Details
存取遭拒 "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" 具有「授權」標題的請求被傳送至不存在的 API 資源路徑。
錯誤使用公有 DNS 名稱叫用私有 API "x-amzn-ErrorType" = "ForbiddenException" "Forbidden"

當使用公有 DNS 名稱從 Amazon Virtual Private Cloud (Amazon VPC) 內叫用私有 API 時,請求中缺少「主機」或 "x-apigw-api-id" 標題。

如需詳細資訊,請參閱使用特定於端點的公有 DNS 主機名稱叫用私有 API

使用預設的 execute-api 端點,叫用具有自訂網域名稱的 REST API。

"x-amzn-ErrorType" = "ForbiddenException" "Forbidden"

停用預設端點後,呼叫者使用預設的 execute-api 端點叫用 REST API。

如需詳細資訊,請參閱停用 REST API 的預設端點

解決方案

遵循這些疑難排解步驟,即有助於確定錯誤原因。

考慮錯誤來源

如果是其他資源報告 403 錯誤,則可能存在其他錯誤原因。例如:

  • 如果 Web 瀏覽器報告錯誤,則該錯誤可能由不正確的代理設定所致。如果不允許存取 HTTP,則代理伺服器會傳回 403 錯誤。
  • 如果 API 前面有另一個 AWS 服務 (例如 Amazon CloudFront),則該服務可以拒絕回應中存在 403 錯誤的請求。

設定 API 存取記錄日誌,進行調查。

確認 API 定義中存在請求的資源

使用 API Gateway 主控台AWS Command Line Interface (AWS CLI) 檢查 API 中請求的資源。

注意: 必須使用最新的 API 定義部署 API。

使用 curl 獲取請求和回應詳細資訊

如果可以重製錯誤,則使用 curl -v 獲取客戶端和 API 之間的更多詳細資訊。

curl -v 命令範例

curl -X GET -v https://apiId.execute-api.region.amazonaws.com/stageName/resourceName

如需詳細資訊,請參閱 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) 檔案中。

Note: 如需有關建立 HAR 檔案的指示,請參閱 如何從瀏覽器為 AWS Support 案例建立 HAR 檔案?

然後,分析用戶端和 API 之間的請求和回應,以確定發生錯誤的位置。