如何針對 API Gateway 的 HTTP 403 錯誤進行疑難排解?
當我呼叫 Amazon API Gateway API 時,出現 403 錯誤。如何針對 API Gateway 的 403 錯誤進行疑難排解?
簡短描述
HTTP 403 回應程式碼表示禁止用戶端存取有效 URL。伺服器了解請求,但由於用戶端問題而無法履行請求。
API Gateway API 會因為下列任何原因而傳回 403 回應:
問題 | 回應標題 | 錯誤訊息 | 根本原因 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者沒有授權可以存取此資源且系統明確拒絕」 | 呼叫者沒有授權,無法存取使用 API Gateway Lambda 授權方的 API。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者 <user-arn> 沒有授權可以在資源 <api-resource-arn> 上執行 execute-api:Invoke 且系統明確拒絕」 | 呼叫者沒有授權可以存取使用 AWS Identity and Access Management (IAM) 授權的 API。或者,API 具有附加的資源政策,明確拒絕呼叫者的存取。 如需詳細資訊,請參閱 IAM 身分驗證和資源政策。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者 anonymous 沒有授權可以在資源 <api-resource-arn> 上執行 execute-api:Invoke」 | 呼叫者沒有授權可以存取使用 IAM 授權的 API。或者,API 有附加的資源政策,未明確允許呼叫者叫用 API。 如需詳細資訊,請參閱 IAM 身分驗證和資源政策。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「請求中包含的安全字符無效。」 | 呼叫者使用了對於存取使用 IAM 授權 的 API 無效的 IAM 金鑰。 |
缺少身分驗證字符 | "x-amzn-errortype" = "MissingAuthenticationTokenException" | 「缺少身分驗證字符」 | 在請求中找不到身分驗證字符。 |
身分驗證字符已過期 | "x-amzn-errortype" = "InvalidSignatureException" | 「簽章已過期」 | 請求中的身分驗證字符已過期。 |
API 金鑰無效 | "x-amzn-errortype" = "ForbiddenException" | 「指定的 API 金鑰識別符無效」 | 呼叫者使用了對於需要 API 金鑰的方法無效的 API 金鑰。 |
簽章無效 | "x-amzn-errortype" = "InvalidSignatureException" | 「我們計算的請求簽章不符合您提供的簽章。請檢查您的 AWS 私密存取金鑰和簽署方法。」 | 當存取使用 IAM 授權的 API 時,請求中的簽章不符合伺服器上的簽章。 |
已篩選的 AWS WAF | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 當 AWS WAF 在 API 中啟動時,請求遭到 Web 應用程式防火牆篩選條件封鎖。 |
資源路徑不存在 | "x-amzn-errortype" = "MissingAuthenticationTokenException" | 「缺少身分驗證字符」 | 沒有「授權」標題的請求傳送到不存在的 API 資源路徑。 若需詳細資訊,請參閱如何解決 API Gateway REST API 端點的 403「缺少身份驗證字符」錯誤? |
資源路徑不存在 | "x-amzn-errortype" = "IncompleteSignatureException" | 「授權標題需要 'Credential' 參數。授權標題需要 'Signature' 參數。Authorization header requires 'SignedHeaders' parameter.授權標題需要有 'X-Amz-Date' 或 'Date' 標題。Authorization=allow" | 具有「授權」標題的請求傳送到不存在的 API 資源路徑。 |
未正確地使用公有 DNS 名稱叫用私有 API | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 未正確地使用公有 DNS 從 Amazon Virtual Private Cloud (Amazon VPC) 內叫用私有 API。例如:在請求中遺漏 "Host" 或 "x-apigw-api-id" 標題。 如需詳細資訊,請參閱使用端點特定公有 DNS 主機名稱叫用您的私有 API。 |
使用預設 execute-api 端點叫用具有自訂網域的 REST API | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 在停用預設端點之後,呼叫者使用預設 execute-api 端點來叫用 REST API。 如需詳細資訊,請參閱停用 REST API 的預設端點 |
使用無效的用戶端憑證叫用需要相互 Transport Layer Security (TLS) 的 API Gateway 自訂網域。 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | API 請求中呈現的用戶端憑證並非由自訂網域名稱的信任庫核發,或者它是無效的。 如需詳細資訊,請參閱如何對來自需相互 TLS 的 API Gateway 自訂網域名稱的 HTTP 403 禁止錯誤,進行故障排除? |
在沒有基本路徑映射的情況下叫用自訂網域名稱 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 呼叫者會叫用自訂網域,而不會將基本路徑映射至 API。 如需詳細資訊,請參閱為 REST API 設定自訂網域名稱。 |
在網域 URL 包含階段時,叫用已啟用自訂網域的 API | "x-amzn-errortype" = "MissingAuthenticationTokenException" | 「缺少身分驗證字符」 | API 映射會指定 API 及階段,並選擇性地指定用於映射的路徑。因此,當 API 的階段映射至自訂網域時,您不再需要在 URL 中包含階段。 如需詳細資訊,請參閱搭配使用 REST API 的 API 映射。 |
要求 URL 中的階段無效 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 呼叫者的要求 URL 包含不存在的階段。確認階段存在以及要求 URL 的拼寫。 如需詳細資訊,請參閱在 Amazon API 閘道中叫用 REST API。 |
解決方案
考慮錯誤來源
如果是其他資源報告 403 錯誤,則可能存在其他錯誤原因。例如:
- 如果 Web 瀏覽器報告錯誤,則該錯誤可能由不正確的代理設定所致。如果不允許 HTTP 存取,代理服務器會傳回 403 錯誤。
- 如果 API 前面有另一個 AWS 服務,則該服務可以拒絕請求,並在回應中出現 403 錯誤。例如:Amazon CloudFront。
識別導致錯誤的原因
如果您還未這麼做,為您的 API 設定 Amazon CloudWatch 存取記錄日誌。然後,在 CloudWatch 中檢視 API 的執行日誌,以判斷請求是否送達 API。
注意:HTTP API 不支援執行記錄功能。若要對需相互 TLS 並叫用 HTTP API 的自訂網域名稱傳回的 403 錯誤,進行故障診斷,您必須執行下列操作:
1. 為您叫用 REST API 僅進行測試的自訂網域名稱,建立新 API 映射。
2. 在 CloudWatch 中檢視 REST API 的執行日誌,找出導致錯誤的原因。
3. 找到並解決錯誤後,將自訂網域名稱的 API 映射重新路由回 HTTP API。
確認 API 定義中存在請求的資源
**注意:**如果您在執行 AWS Command Line Interface (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}
**注意:**如需詳細資訊,請參閱 curl 專案網站。
驗證請求標題是否正確
如果錯誤是無效的 API 金鑰造成的結果,則驗證是否在請求中傳送 "x-api-key" 標題。
驗證任何界面 Amazon VPC 端點上的 DNS 設定皆已正確設定
**注意:**針對從僅有界面 VPC 端點的 Amazon VPC 叫用的 API,確認下列項目。
根據您使用的 API 類型,驗證界面端點上的 DNS 設定為正確設定。
請記住以下幾點:
- 若要從 Amazon VPC 內叫用區域 API,私有 DNS 名稱必須在界面端點上停用。然後,可以透過公有 DNS 解析端點的主機名稱。如需詳細資訊,請參閱在 Amazon API Gateway 中建立私有 API。
- 若要使用 API 的私有 DNS 名稱從 Amazon VPC 內叫用私有 API,私有 DNS 名稱必須在界面端點上啟用。然後,介面端點的主機名稱可解析為 Amazon VPC 的本地子網路資源。如需詳細資訊,請參閱如何叫用私有 API。
**注意:**如果您使用以下任一項目叫用私有 API,則不需要設定私有 DNS:
私有 API 的公有 DNS 名稱。
-或-
Amazon Route 53 別名。
檢閱 API 的資源政策
檢閱 API 的資源政策以驗證下列項目:
- (對於從具有界面 VPC 端點的 Amazon VPC 叫用的 API) API 的資源政策會授予 Amazon VPC 或界面端點對於 API 的存取權。
- 資源政策的資源規格和格式正確。
**注意:**儲存資源政策時,不會驗證資源規格。如需範例,請參閱 API Gateway 資源政策範例。 - 呼叫者可以依據您為 API 定義的身分驗證類型來叫用 API 端點。如需詳細資訊,請參閱 API Gateway 資源政策如何影響授權工作流程。
檢閱 HTTP 請求和回應訊息
如果可能,在 Web 瀏覽器中重現錯誤。然後,使用瀏覽器的網絡工具擷取 HTTP 請求和回應訊息,並對其進行分析以判斷錯誤發生的位置。
**注意:**對於離線分析,請將訊息儲存在 HTTP 封存 (HAR) 檔案。
相關資訊
如何僅允許特定 IP 地址存取我的 API Gateway REST API?
如何對連線至 API Gateway 私有 API 端點時的問題進行疑難排解?
如何開啟 Amazon CloudWatch Logs 以對 API Gateway REST API 或 WebSocket API 進行疑難排解?
相關內容
- 已提問 3 天前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 6 個月前
- AWS 官方已更新 2 個月前
- AWS 官方已更新 1 年前