建立 AWS Lambda Authorizer 後,對 Amazon API Gateway REST API 的呼叫收到「403 禁止」錯誤。如何對這些錯誤進行疑難排解?
簡短描述
如果出現以下情況,就會發生:
如果對 API 呼叫的字符或身分來源遺失、為 Null 或未經驗證,則會收到「401 未經授權」錯誤。如需詳細資訊,請參閱為什麼在建立 Lambda Authorizer 之後收到 API Gateway「401 未經授權」錯誤?
**注意:**本文解決了與僅針對 REST API 設定的 Lambda Authorizer 相關的 403 錯誤。如需有關對其他 403 錯誤類型進行疑難排解的資訊,請參閱如何對來自 API Gateway 的「HTTP 403 禁止」錯誤疑難排解?
解決方法
確認錯誤的原因
注意:
1. 檢閱 API Gateway 回應中的錯誤訊息。尋找類似下列其中一項的錯誤訊息。
傳回含有明確拒絕的 IAM 政策文件的 Lambda Authorizer 函數的錯誤訊息範例
{
"message": "User is not authorized to access this resource with an explicit deny"
}
傳回含有隱含拒絕的 IAM 政策文件的 Lambda Authorizer 函數的錯誤訊息範例
{
"message": "User is not authorized to access this resource"
}
具有隱含拒絕存取呼叫者之連接資源政策的 REST API 的錯誤訊息範例
{
"message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>"
}
具有明確拒絕存取呼叫者之連接資源政策的 REST API 的錯誤訊息範例
{
"message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny"
}
**注意:**如需有關存取 API Gateway API 受 IAM 政策控制時所產生的行為的詳細資訊,請參閱政策評估結果表。
2. 在 CloudWatch 中檢視 API Gateway 執行記錄,以檢閱授權工作流程。請注意 Lambda Authorizer 的輸出,以及 API Gateway 資源政策評估的結果。您會收到類似下列其中一項的日誌錯誤訊息。
所需字符遺失或與字符驗證不相符時的日誌錯誤訊息範例
Extended Request Id: MY92nHDwwwIdGxzR=
Unauthorized request: <request-id>
注意:延伸請求 ID 是隨機產生的。日誌中的延伸請求 ID 值不同。
Lambda Authorizer 傳回拒絕存取的政策時的日誌錯誤訊息範例
Sending request to https://lambda.<region>.amazonaws.com/2015-03-31/functions/<lambda-authorizer-arn>/invocations
Authorizer result body before parsing:
{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Deny",
"Resource": "<resource-arn>"
}
]
}
}
Using valid authorizer policy for principal: <principal>
Successfully completed authorizer execution
The client is not authorized to perform this operation.
**注意:**傳回的政策取決於您的 Lambda Authorizer。如果傳回政策的 resource-arn 不包含請求的資源,則會隱含拒絕請求。
API Gateway 資源政策拒絕請求時的日誌錯誤訊息範例
Extended Request Id: MY-BIVb4GEdGeZB=
ExplicitDenyException User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny: <request-id>
解決來自 Lambda Authorizer 的「無權存取此資源」錯誤
您可能會因為政策快取而間歇性地收到無權存取此資源錯誤。若要確認授權快取已開啟,請在 API Gateway 主控台中檢閱 Lambda Authorizer 的組態。然後,執行下列其中一個操作:
- 對於一次性測試,請執行 AWS CLI 命令 flush-stage-authorizers-cache。排清 Authorizer 的快取項目後,再次呼叫您的 API。
- 關閉政策快取,然後再次呼叫您的 API。
**注意:**當您關閉以請求參數為基礎的 Authorizer 的政策快取時,API Gateway 不會在叫用 Lambda Authorizer 函數之前驗證對 API 的呼叫。
- 透過更新字符來源 (針對以字符為基礎的 Authorizer) 或身分來源 (針對以請求參數為基礎的 Authorizer) 中指定的標頭名稱來變更 Authorizer 的快取金鑰。重新部署您的 API 以認可變更。然後,使用新設定的字符標頭或身分來源再次呼叫您的 API。
如果始終發生錯誤,請檢閱 Lambda Authorizer 函數的程式碼,判斷 Authorizer 明確拒絕呼叫者存取的原因。如果您確定問題是由快取引起的,則可以更新程式碼,以允許存取呼叫者。如需說明,請參閱為什麼我的 API Gateway Proxy 資源 (具有已啟動快取的 Lambda authorizer) 會傳回 HTTP 403 錯誤?
解決「無權執行:execute-api:Invoke」錯誤
透過檢閱 API 的資源政策,確定您的 API 資源政策是否無效,或者是否明確拒絕存取您的呼叫。您可以檢視 API 的執行日誌以取得資源政策的回應結果。
如需詳細資訊,請參閱 Amazon API Gateway 和 Lambda Authorizer 和資源政策的存取政策語言概觀。
相關資訊
使用 API Gateway Lambda Authorizer
更新需要重新部署的 REST API
在 API Gateway 中控制和管理 REST API 的存取