如何疑難排解 API Gateway 的 HTTP 403 錯誤?
當我呼叫我的 Amazon API Gateway API 時,我收到 403 錯誤。
簡短說明
HTTP 403 回應代碼表示用戶端遭禁止存取有效 URL。伺服器理解請求,但由於用戶端問題,無法履行請求。
因為下列任一原因,API Gateway API 可以傳回 403 回應:
問題 | 回應標頭 | 錯誤訊息 | 根本原因 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者未獲得存取此資源的權限,收到明確拒絕」 | 呼叫者未獲得存取使用 API Gateway Lambda 授權者 API 的權限。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者: <user-arn> 未經授權執行:execute-api: 在資源中調用: <api-resource-arn> 明確拒絕」 | 呼叫者未獲得存取使用 AWS Identity and Access Management (IAM) 授權 API 的權限。或者,API 具有附加的資源政策,該政策明確拒存取呼叫者。<br><br>如需詳細資訊,請參閱 IAM 驗證和資源政策。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「使用者:匿名未經授權執行:execute-api: 在資源中調用:<api-resource-arn>」 | 呼叫者未獲得存取使用 IAM 授權 API 的權限。或者,API 具有附加的資源政策,該政策不會明確允許呼叫者調用 API。<br><br>如需詳細資訊,請參閱 IAM 驗證和資源政策。 |
存取遭拒 | "x-amzn-errortype" = "AccessDeniedException" | 「請求中包含的安全權杖無效。」 | 呼叫者使用無效的 IAM 金鑰來存取使用 IAM 授權的 API。 |
缺少驗證權杖 | "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" | 「禁止」 | 當 ](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)API 中的 AWS WAF 啟用[後,Web 應用程式防火牆篩選會封鎖請求。 |
資源路徑不存在 | "x-amzn-errortype" = "MissingAuthenticationTokenException" | 「缺少驗證權杖」 | 沒有「授權」標頭的請求將傳送到不存在的 API 資源路徑。<br><br>如需詳細資訊,請參閱如何疑難排解來自 API 閘道 REST API 端點的 403「缺少驗證權杖」錯誤? |
資源路徑不存在 | "x-amzn-errortype" = "IncompleteSignatureException" | 「授權標頭需要『Credential』參數。授權標頭需要『Signature』參數。授權標頭需要『SignedHeaders』參數。授權標頭需要擁有『X-Amz-Date』或『日期』標頭。Authorization=allow」 | 標頭為「授權」的請求會傳送到不存在的 API 資源路徑。 |
不正確使用公開 DNS 名稱調用私有 API | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 不正確使用公開 DNS 名稱從 Amazon Virtual Private Cloud (Amazon VPC) 中調用私有 API。例如:請求缺少**「Host」** 或**「x-apigw-api-id」**標頭。<br><br>如需詳細資訊,請參閱使用端點特定的公用 DNS 主機名稱調用私有 API。 |
使用預設的 execute-api 端點調用具有自訂網域名稱的 REST API | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 在停用預設端點後,呼叫者使用預設的 execute-api 端點來調用 REST API。<br><br>如需詳細資訊,請參閱停用 REST API 的預設端點 |
使用無效的用戶端憑證調用需要相互 Transport Layer Security (TLS) 的 API 閘道自訂網域名稱。 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | API 請求中顯示的用戶端憑證不是由自訂網域名稱的信任存放區發出,或者無效。<br><br>如需詳細資訊,請參閱如何從需要相互 TLS 的 API 閘道自訂網域名稱疑難排解 HTTP 403 禁止錯誤? |
在沒有基本路徑映射的情況下調用自訂網域名稱 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 呼叫者會調用自訂網域,而不會將基本路徑映射到 API。<br><br>如需詳細資訊,請參閱設定 REST API 的自訂網域名稱。 |
當網域 URL 包含階段時,調用啟用自訂網域的 API | "x-amzn-errortype" = "MissingAuthenticationTokenException" | 「缺少驗證權杖」 | API 映射會指定 API、階段,還可以選擇用於映射的路徑。因此,當 API 的階段映射到自訂網域時,您不再需要在 URL 中包含該階段。<br><br>如需詳細資訊,請參閱使用 REST API 的 API 映射。 |
請求 URL 中的階段無效 | "x-amzn-errortype" = "ForbiddenException" | 「禁止」 | 呼叫者的請求 URL 包含不存在的階段。確認階段是否存在,以及請求 URL 的拼寫。<br><br>如需詳細資訊,請參閱在 Amazon API Gateway 中調用 REST API。 |
解決方法
考慮錯誤的來源
如果 403 錯誤是從其他資源報告通報,則可能是其他原因導致錯誤。例如:
- 如果錯誤是在 Web 瀏覽器中通報,則該錯誤可能是由不正確的代理設定所造成的。如果不允許 HTTP 存取,代理伺服器會傳回 403 錯誤。
- 如果 API 前面有另一個 AWS 服務,則該服務可以在回應中出現 403 錯誤的情況下拒絕請求。例如: Amazon CloudFront。
識別造成錯誤的原因
如果您尚未這樣做,請設定 API 的 Amazon CloudWatch 存取記錄功能。然後,在 CloudWatch 中檢視 API 的執行記錄,以判斷要求是否到達 API。
注意:HTTP API 不支援執行記錄。若要疑難排解由需要相互 TLS 並調用 HTTP API 的自訂網域名稱傳回的 403 錯誤,您必須執行下列操作:
1. 為您的自訂網域名稱建立新的 API 映射,以調用僅用於測試的 REST API。
2. 檢視您 REST API 在 CloudWatch 中的執行日誌,識別造成錯誤的原因。
3. 識別並解決錯誤後,將您自訂網域名稱的 API 映射重新路由至 HTTP API。
確認 API 定義中具備要求的資源
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新的 AWS CLI 版本。
使用 API Gateway 主控台或 AWS CLI 驗證下列項目:
- API 採用最新的 API 定義](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-deploy-api.html)部署[。
- 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,請確認下列項目。
驗證介面端點的 DNS 設定是否已根據您使用的 API 類型正確設定。
請記住以下幾點:
- 若要從 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 進行疑難排解?
相關內容
- 已提問 2 個月前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 10 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前