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 | この場合、規則は有効ではなく、次の規則が適用されます。 |
使用法
- ポリシー セクション: inbound
- ポリシー スコープ: グローバル、ワークスペース、製品、API
- ゲートウェイ: クラシック、v2、従量課金、セルフホステッド、ワークスペース
使用上の注意
このポリシーは、ポリシー セクションで一度だけ使用できます。
GraphQL クエリではフラット化されたスキーマが使用されるため、出力の種類の任意のリーフ ノードにアクセス許可を適用できます。
- mutation、query、または subscription
- 型宣言内の個々のフィールド
アクセス許可は、以下には適用されません。
- 入力の種類
- fragments
- Unions
- インターフェイス
- スキーマ要素
このポリシーでは、すべてのレベルにわたり最大 250 個のクエリ フィールドを含む GraphQL 要求を検証できます。
エラー処理
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>
関連ポリシー
関連するコンテンツ
ポリシーに対する処理の詳細については、次のトピックを参照してください。