將 Lambda Authorizer 與 API Gateway REST API 搭配使用時,如何對「HTTP 403 禁止」錯誤進行疑難排解?

3 分的閱讀內容
0

建立 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 GatewayLambda Authorizer 和資源政策的存取政策語言概觀。


相關資訊

使用 API Gateway Lambda Authorizer

更新需要重新部署的 REST API

在 API Gateway 中控制和管理 REST API 的存取