解碼 JWT 執行階段錯誤疑難排解

您目前查看的是 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

FailedToDecode

錯誤代碼

steps.jwt.FailedToDecode

錯誤回應主體

{
  "fault": {
    "faultstring": "Failed to Decode Token: policy({0})",
    "detail": {
       "errorcode": "steps.jwt.FailedToDecode"
     }
  }
}

原因

如果 Decode JWT 政策的 <Source> 元素中指定的 JSON Web Token (JWT) 格式有誤、無效或無法解碼,就會發生這項錯誤。

結構正確的 JWT 應包含標頭、酬載和簽名,格式如下:header.payload.signature。如果傳遞至 DecodeJWT 政策的 JWT 缺少元件部分,就會發生錯誤。舉例來說,如果 JWT 只有 payload.signature,但缺少 header,就會發生錯誤。

診斷

  1. 找出「解碼 JWT」政策的 <Source> 元素中指定的變數。這個變數應包含 JWT。

    以下是解碼 JWT 政策的範例:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    在上述範例中,JWT 應包含在 Authorization 要求標頭中。

  2. 檢查步驟 1 中識別的變數,確認其中包含的 JWT 是否有效。如果輸入的 JWT 無效,就是造成錯誤的原因。

    在下列 API 要求範例中,輸入的 JWT 會在 Authorization 要求標頭中傳遞:

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    其中 $EXTERNAL_IP 是外部負載平衡器的 IP 位址。 這個 IP 位址會向網際網路公開。詳情請參閱「自訂存取路徑」。

    仔細檢查 JWT 後,發現格式為 payload.signature,這是無效格式。JWT 的預期格式為 header.payload.signature。因此,解碼 JWT 政策會失敗,並顯示以下錯誤:

    "faultstring": "Failed to Decode Token: policy({0})"
    

解析度

確認傳遞至「解碼 JWT」政策的 JWT 包含所有三個元素、格式正確且可解碼。

如要修正上述範例,您可以傳遞格式為 header.payload.signature 的有效 JWT。如要進行這項操作,請使用 cURL 指令發出 API 呼叫,如下所示:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

其中 $EXTERNAL_IP 是外部負載平衡器的 IP 位址。 這個 IP 位址會向網際網路公開。詳情請參閱「自訂存取路徑」。

InvalidToken

錯誤代碼

steps.jwt.InvalidToken

錯誤回應主體

{
  "fault": {
    "faultstring": "Invalid token: policy({0})",
    "detail": {
      "errorcode": "steps.jwt.InvalidToken"
     }
  }
}

原因

如果 Decode JWT 政策的 <Source> 元素中指定的流程變數符合下列條件,就會發生這個錯誤:

  • 超出範圍 (無法在執行政策的特定流程中使用),或
  • 無法解析 (未定義)

診斷

  1. 找出「解碼 JWT」政策的 <Source> 元素中指定的變數。這個變數應包含 JWT。

    以下是解碼 JWT 政策的範例:

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    在上述範例中,授權要求標頭應包含 JWT。

  2. 判斷步驟 1 中識別的變數是否已定義,且可在執行「解碼 JWT」政策的流程中使用。

  3. 如果變數為下列任一值:

    • 超出範圍 (無法在執行政策的特定流程中使用),或
    • 無法解析 (未定義)

    這就是錯誤原因。

    在下方的 API 要求範例中,使用者未在授權要求標頭中傳遞 JWT。

    curl -v "http://$EXTERNAL_IP/v1/decodeJWT"
    

其中 $EXTERNAL_IP 是外部負載平衡器的 IP 位址。 這個 IP 位址會向網際網路公開。詳情請參閱「自訂存取路徑」。

Because the authorization request header is not passed, the Decode JWT policy fails with the error:

```
"faultstring": "Invalid token: policy({0})"
```

解析度

確認「解碼 JWT」政策的 <Source> 元素中參照的變數已定義、包含有效的 (可解碼) JWT,且可在執行「解碼 JWT」政策的特定流程中使用。

如要修正上述範例,您可以在要求授權標頭中傳遞有效的 JWT。如要完成這項操作,請使用 cURL 指令發出 API 呼叫,如下所示:

curl -v "http://$EXTERNAL_IP/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

其中 $EXTERNAL_IP 是外部負載平衡器的 IP 位址。 這個 IP 位址會向網際網路公開。詳情請參閱「自訂存取路徑」。