Decode JWT ランタイム エラーのトラブルシューティング

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
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 の形式で格納する必要があります。Decode JWT ポリシーに渡された JWT にコンポーネント部分がない場合、エラーが発生します。たとえば、JWT に payload.signature しかなく、その header がない場合は、エラーが発生します。

診断

  1. Decode JWT ポリシーの <Source> 要素で指定された変数を特定します。この変数には JWT を含める必要があります。

    Decode 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 です。その結果、Decode JWT ポリシーが失敗し、次のエラーが発生します。

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

解決策

Decode JWT ポリシーに渡される JWT に、3 つの要素すべてが含まれ、正しい形式になっており、デコード可能であることを確認してください。

上記の例を修正するには、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. Decode JWT ポリシーの <Source> 要素で指定された変数を特定します。この変数には JWT を含める必要があります。

    Decode JWT ポリシーの例を次に示します。

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

    上記の例では、Authorization リクエスト ヘッダーに JWT が含まれている必要があります。

  2. 手順 1 で特定された変数が定義されていて、Decode JWT ポリシーが実行されるフローで使用できることを確認します。

  3. 変数が次のいずれかの状態になっていないか確認します。

    • 範囲外(ポリシーが実行されている特定のフローで使用できない)
    • 解決できない(定義されていない)

    いずれかの状態が当てはまる場合、それがエラーの原因です。

    下記の API リクエストの例では、JWT がユーザーにより Authorization リクエスト ヘッダーで渡されていません。

    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})"
```

解決策

Decode JWT ポリシーの <Source> 要素で参照される変数が定義され、有効な(デコード可能な)JWT が含まれ、Decode JWT ポリシーが実行される特定のフローで使用できることを確認します。

上記の例を修正するには、リクエスト Authorization ヘッダーで有効な JWT を渡します。これを行うには、次のように cURL コマンドを使用して API を呼び出します。

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

ここで、$EXTERNAL_IP は、外部ロードバランサの IP アドレスです。この IP アドレスはインターネットに公開されます。詳細については、ルーティングの構成をご覧ください。