BasicAuthentication ポリシーのランタイム エラーのトラブルシューティング

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する。

UnresolvedVariable

エラーコード

steps.basicauthentication.UnresolvedVariable

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Unresolved variable : [variable_name]",
        "detail": {
            "errorcode": "steps.basicauthentication.UnresolvedVariable"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "Unresolved variable : request.header.Authorization",
        "detail": {
            "errorcode": "steps.basicauthentication.UnresolvedVariable"
        }
    }
}

原因

このエラーは、BasicAuthentication ポリシー<Source> 要素で指定された Base64 エンコード文字列を含む変数が次のいずれかである場合に発生します。

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

たとえば、BasicAuthentication ポリシーに <Source> 要素の request.header.Authorization として指定されている変数がある一方で、Authorization ヘッダーが API リクエストの一部として渡されない場合は、このエラーが発生します。

診断

  1. BasicAuthentication ポリシーの <Source> 要素に使用される変数を特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring,<Source> 要素に使用されている変数は request.header.Authorization です。

    "faultstring": "Unresolved variable : request.header.Authorization"
    
  2. エラーが発生した特定の API プロキシで、すべての BasicAuthentication ポリシーを調べます。BasicAuthentication ポリシーは複数ある場合があります。<Source> 要素で指定された変数が障害の文字列で識別された変数名(上記のステップ 1)と一致する、特定の BasicAuthentication ポリシーを特定します。

    たとえば、次のポリシーにより、<Source> 要素が request.header.Authorization という名前の変数に設定されます。これは、faultstring の内容と一致します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
      <DisplayName>Decode Basic Authentication Header</DisplayName>
      <Operation>Decode</Operation>
      <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
      <User ref="request.header.username"/>
      <Password ref="request.header.password"/>
      <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. 変数が定義されており、BasicAuthentication ポリシーが実行されているフローで使用できるかどうかを確認します。

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

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

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

    上記の BasicAuthentication ポリシーの例では、変数 request.header.Authorization がリクエストの一部として渡されませんでした。つまり、API リクエストは下記のように、Authorization ヘッダーなしで作成されていました。

    curl -v "http://$EXTERNAL_IP/basicauth"

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

    BasicAuthentication ポリシーで使用されている変数が利用できないため、次のエラーコードを受け取ります。

    steps.basicauthentication.UnresolvedVariable
    

解決策

BasicAuthentication ポリシーで使用される変数が定義されているか、入力として渡されており、ポリシーが実行されるフローで使用できることを確認します。

上記のサンプルの BasicAuthentication ポリシーに関する問題を解決するには、次のように API リクエストを行います。

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

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

InvalidBasicAuthenticationSource

エラーコード

steps.basicauthentication.InvalidBasicAuthenticationSource

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Source variable : [variable_name] for basic authentication decode policy is not valid",
        "detail": {
            "errorcode": "steps.basicauthentication.InvalidBasicAuthenticationSource"
        }
    }
}

エラーの例のエラー メッセージ

{
    "fault": {
        "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid",
        "detail": {
            "errorcode": "steps.basicauthentication.InvalidBasicAuthenticationSource"
        }
    }
}

考えられる原因

このエラーには、次の原因が考えられます。

原因 説明
ソース変数が無効 BasicAuthentication ポリシーの入力ソース変数が、有効な Base64 エンコード文字列ではありません。
ヘッダーの形式が不正 BasicAuthentication ポリシーに渡される Base64 でエンコードされた文字列を含むヘッダーの形式が正しくありません。

原因: ソース変数が無効

このエラーは、BasicAuthentication ポリシー<Source> 要素で指定された Base64 エンコード文字列を含む変数に有効な値が含まれていない場合に発生します。

たとえば、BasicAuthentication ポリシーの <Source> 要素に指定された変数に有効な Base64 エンコード文字列がない場合は、このエラーが発生します。

診断

  1. BasicAuthentication ポリシーの <Source> 要素に使用される変数を特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次の faultstring,<Source> 要素に使用されている変数は request.header.Authorization です。

    "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid"
    
  2. エラーが発生した特定の API プロキシで、すべての BasicAuthentication ポリシーを調べます。BasicAuthentication ポリシーは複数ある場合があります。<Source> 要素で指定された変数がエラーの文字列で識別された変数名(上記のステップ 1)と一致する特定の BasicAuthentication ポリシーを特定します。

    たとえば、次のポリシーにより、<Source> 要素が request.header.Authorization という名前の変数に設定されます。これは、faultstring の内容と一致します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
        <DisplayName>Decode Basic Authentication Header</DisplayName>
        <Operation>Decode</Operation>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <User ref="request.header.username"/>
        <Password ref="request.header.password"/>
        <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. <Source> 要素で指定された変数に格納された値が有効な Base64 エンコード文字列でない場合は、これがエラーの原因です。

    上記の BasicAuthentication ポリシーの例では、クライアントからヘッダーとして送信された変数 request.header.Authorization が、次に示すように無効でした。

    curl -v "http://$EXTERNAL_IP /basicauth" -H "Authorization: Basic 23435"

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

    変数 request.header.Authorization に無効な Base64 エンコード文字列 "23435" が含まれているため、次のエラーコードを受け取ります。

    steps.basicauthentication.InvalidBasicAuthenticationSource

解決策

BasicAuthentication ポリシーの <Source> 要素に指定された変数に、有効な Base64 エンコード文字列があることを確認します。

上記のサンプルの BasicAuthentication ポリシーに関する問題を解決するには、次のように Authorization ヘッダーに有効な Base64 でエンコードされた文字列を渡して API リクエストを行います。

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

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

原因: ヘッダーの形式が不正または無効

このエラーは、BasicAuthentication ポリシーに渡されたヘッダーの形式が正しくないか無効な場合に発生します。

たとえば、BasicAuthentication ポリシーで <Source> 要素に request.header.Authorization として指定された変数があり、API リクエストの一部として渡されるヘッダーの形式が正しくない場合や無効な場合にこのエラーが発生します。

診断

  1. BasicAuthentication ポリシーの <Source> 要素に使用される変数を特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。たとえば、次のエラーで <Source> 要素に使用されている変数は request.header.Authorization です。

    "faultstring": "Source variable : request.header.Authorization for basic authentication decode policy is not valid"
    
  2. エラーが発生した特定の API プロキシで、すべての BasicAuthentication ポリシーを調べます。BasicAuthentication ポリシーは複数ある場合があります。<Source> 要素で指定された変数がエラーの文字列で識別された変数名(上記のステップ 1)と一致する特定の BasicAuthentication ポリシーを特定します。

    たとえば、次のポリシーにより、<Source> 要素が request.header.Authorization という名前の変数に設定されます。これは、faultstring の内容と一致します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BasicAuthentication name="DecodeBaseAuthHeaders">
        <DisplayName>Decode Basic Authentication Header</DisplayName>
        <Operation>Decode</Operation>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <User ref="request.header.username"/>
        <Password ref="request.header.password"/>
        <Source>request.header.Authorization</Source>
    </BasicAuthentication>
    
  3. 変数がヘッダーで、形式が正しくない場合や無効の場合は(つまり認証タイプがないか、認証タイプが「基本」でない場合)、これがエラーの原因です。

    Authorization ヘッダーの形式は次のとおりです。

    Authorization: <Authentication type> <credentials>
    

    正しくない形式のヘッダーは、次の 2 つの方法で BasicAuthentication ポリシーに渡されます。

    例 1: ヘッダーに認証タイプがない場合:

    curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: YWthc2g6MTIz"

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

    上記の例では、Authorization ヘッダーに Authentication タイプがありません。このヘッダーが上記の BasicAuthentication ポリシーに渡された場合は、次のエラーコードを受け取ります。

    steps.basicauthentication.InvalidBasicAuthenticationSource
    

    例 2: Authentication タイプが「Basic」ではない場合:

    curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: OAuth YWthc2g6MTIz"

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

    上記の例では、Authorization ヘッダーに、「Basic」という Authentication タイプがありません。これが上記の BasicAuthentication ポリシーに渡された場合は、次のエラーコードを受け取ります。

    steps.basicauthentication.InvalidBasicAuthenticationSource
    

    同様に、Authorization ヘッダーで、Bearer、Digest Auth などの Authentication タイプが使用されている場合も、このエラーが発生します。

解決策

BasicAuthentication ポリシーへの入力が渡されているヘッダーに Authentication タイプがあり、「Basic」であることを確認します。

上記のサンプルの BasicAuthentication ポリシーに関する問題を解決するには、次のように Authorization ヘッダーに「Basic」認証タイプで有効な Base64 エンコード文字列を渡して API リクエストを行います。

curl -v "http://$EXTERNAL_IP/basicauth" -H "Authorization: Basic YWthc2g6MTIz"

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