GraphQL 要求の検証

適用対象: すべての API Management レベル

validate-graphql-request ポリシーでは、GraphQL 要求を検証し、GraphQL API 内で特定のクエリ パスへのアクセスを承認します。 無効なクエリは "要求エラー" です。 承認は、有効な要求に対してのみ実行されます。

Note

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 API Management ポリシーを設定または編集する方法について説明します。

ポリシー ステートメント

<validate-graphql-request error-variable-name="variable name" max-size="size in bytes" max-depth="query depth">
    <authorize>
        <rule path="query path, for example: '/listUsers' or '/__*'" action="string or policy expression that evaluates to 'allow | remove | reject | ignore'" />
    </authorize>
</validate-graphql-request>

属性

属性 説明 必要 Default
error-variable-name 検証エラーをログに記録する context.Variables の変数の名前。 ポリシー式を使用できます。 いいえ なし
max-size 要求ペイロードの最大サイズ (バイト単位)。 許容される最大値: 102,400 バイト (100 KB)。 (この制限を引き上げる必要がある場合は、、サポートにお問い合わせください)。ポリシー式を使用できます。 はい 該当なし
max-depth 整数。 クエリの深さの最大値。 ポリシー式を使用できます。 いいえ 6

要素

名前 説明 必須
承認 この要素を追加して、1 つ以上のパスに適切な認可規則を設定します。 いいえ
ルール 特定のクエリ パスを承認するには、これらの要素を 1 つ以上追加します。 各規則では、必要に応じて別のアクションを指定できます。 ポリシー式を使用して、条件付きで指定することができます。 いいえ

rule の属性

属性 説明 必要 Default
path 承認検証を実行するためのパス。 これは、パターン /type/field に従う必要があります。 はい なし
action ルールが適用される場合に実行するアクション。 ポリシー式を使用して、条件付きで指定することができます。 いいえ allow

イントロスペクション システム

path=/__* のポリシーは、イントロスペクションシステムです。 これを使用して、イントロスペクション要求 (__schema__type など) を拒否できます。

要求アクション

利用可能なアクションを次の表で説明します。

アクション 説明
reject 要求エラーが発生し、要求はバックエンドに送信されません。 構成されている場合、追加の規則は適用されません。
remove フィールドエラーが発生し、フィールドが要求から削除されます。
allow フィールドがバックエンドに渡されます。
ignore この場合、規則は有効ではなく、次の規則が適用されます。

使用法

使用上の注意

  • API Management にインポートされたパススルーまたは合成 GraphQL API のポリシーを構成します。

  • このポリシーは、ポリシー セクションで一度だけ使用できます。

  • GraphQL クエリではフラット化されたスキーマが使用されるため、出力の種類の任意のリーフ ノードにアクセス許可を適用できます。

    • mutation、query、または subscription
    • 型宣言内の個々のフィールド

    アクセス許可は、以下には適用されません。

    • 入力の種類
    • fragments
    • Unions
    • インターフェイス
    • スキーマ要素

エラー処理

GraphQL スキーマに対する検証に失敗した場合、または要求のサイズまたは深さのエラーが発生した場合は、要求エラーが発生し、エラーブロック (データブロックなし) で要求が失敗します。

Context.LastError プロパティと同様に、すべての GraphQL 検証エラーは自動的に GraphQLErrors 変数に反映されます。 エラーを個別に反映する必要がある場合は、エラー変数名を指定できます。 error 変数と GraphQLErrors 変数にエラーがプッシュされます。

クエリの検証

この例では、次の検証規則と承認規則を GraphQL クエリに適用します。

  • 100 kb を超える要求、またはクエリの深さが 4 を超える要求は拒否されます。
  • イントロスペクション システムへの要求は拒否されます。
  • /Missions/name フィールドは、2 つより多いヘッダーを含む要求から削除されます。
<validate-graphql-request error-variable-name="name" max-size="102400" max-depth="4"> 
    <authorize>
        <rule path="/__*" action="reject" /> 
        <rule path="/Missions/name" action="@(context.Request.Headers.Count > 2 ? "remove" : "allow")" />
    </authorize>
</validate-graphql-request> 

mutation の検証

この例では、次の検証規則と承認規則を GraphQL mutation に適用します。

  • 100 kb を超える要求、またはクエリの深さが 4 を超える要求は拒否されます。
  • 要求が IP アドレス 198.51.100.1 からのものである場合を除き、deleteUser フィールドの変換の要求は拒否されます。
<validate-graphql-request error-variable-name="name" max-size="102400" max-depth="4"> 
    <authorize>
        <rule path="/Mutation/deleteUser" action="@(context.Request.IpAddress <> "198.51.100.1" ? "deny" : "allow")" />
    </authorize>
</validate-graphql-request> 

ポリシーに対する処理の詳細については、次のトピックを参照してください。