Validasi permintaan GraphQL

BERLAKU UNTUK: Semua tingkatAN API Management

Kebijakan validate-graphql-request memvalidasi permintaan GraphQL dan mengotorisasi akses ke jalur kueri tertentu di API GraphQL. Kueri yang tidak valid adalah "kesalahan permintaan". Otorisasi hanya dilakukan untuk permintaan yang valid.

Catatan

Tetapkan elemen kebijakan dan elemen turunan dalam urutan yang disediakan dalam pernyataan kebijakan. Pelajari lebih lanjut cara mengatur atau mengedit kebijakan API Management.

Pernyataan kebijakan

<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>

Atribut

Atribut Deskripsi Wajib diisi Default
error-variable-name Nama variabel di context.Variables untuk mencatat kesalahan validasi. Ekspresi kebijakan diizinkan. No T/A
max-size Ukuran maksimum payload permintaan dalam byte. Nilai maksimum yang diperbolehkan: 102.400 byte (100 KB). (Hubungi dukungan jika Anda perlu meningkatkan batas ini.) Ekspresi kebijakan diizinkan. Ya T/A
kedalaman maks Bilangan bulat. Kedalaman kueri maksimum. Ekspresi kebijakan diizinkan. No 6

Elemen

Nama Deskripsi Wajib diisi
Otorisasi Tambahkan elemen ini untuk mengatur aturan otorisasi yang sesuai untuk satu atau beberapa jalur. No
rule Tambahkan satu atau beberapa elemen ini untuk mengotorisasi jalur kueri tertentu. Setiap aturan dapat secara opsional menentukan tindakan yang berbeda. Dapat ditentukan secara kondisional dengan menggunakan ekspresi kebijakan. No

atribut aturan

Atribut Deskripsi Wajib diisi Default
jalan Jalur kueri untuk menjalankan validasi otorisasi. Jalur ini harus mengikuti pola: /type/field. Ya T/A
tindakan Tindakan yang harus dilakukan jika aturan berlaku. Dapat ditentukan secara kondisional dengan menggunakan ekspresi kebijakan. No izinkan

Sistem introspeksi

Kebijakan untuk path=/__* adalah sistem introspeksi. Anda dapat menggunakannya untuk menolak permintaan introspeksi (__schema, __type, dll.).

Meminta tindakan

Tindakan yang tersedia dijelaskan dalam tabel berikut.

Tindakan Deskripsi
Menolak Terjadi kesalahan permintaan, dan permintaan tidak dikirim ke backend. Jika dikonfigurasi, aturan tambahan tidak akan diterapkan.
buka Kesalahan bidang terjadi, dan bidang dihapus dari permintaan.
izinkan Bidang diteruskan ke backend.
abaikan Aturan tidak valid untuk kasus ini dan yang akan diterapkan adalah aturan berikutnya.

Penggunaan

Catatan penggunaan

  • Konfigurasikan kebijakan untuk API GraphQL pass-through atau sintetis yang telah diimpor ke API Management.

  • Kebijakan ini hanya dapat digunakan sekali di bagian kebijakan.

  • Karena kueri GraphQL menggunakan skema yang diratakan, izin dapat diterapkan pada node daun apa pun dari jenis output:

    • Mutasi, kueri, atau langganan
    • Bidang individual dalam deklarasi jenis

    Izin tidak dapat diterapkan ke:

    • Jenis input
    • Fragmen
    • Union
    • Antarmuka
    • Elemen skema

Penanganan kesalahan

Kegagalan untuk memvalidasi terhadap skema GraphQL, atau kegagalan untuk ukuran atau kedalaman permintaan, adalah kesalahan permintaan dan mengakibatkan permintaan gagal dengan blok kesalahan (tetapi tidak ada blok data).

Mirip dengan properti Context.LastError, semua kesalahan validasi GraphQL secara otomatis disebarkan dalam variabel GraphQLErrors. Jika kesalahan perlu disebarkan secara terpisah, Anda dapat menentukan nama variabel kesalahan. Kesalahan didorong ke variabel error dan variabel GraphQLErrors.

Contoh

Validasi kueri

Contoh ini menerapkan aturan validasi dan otorisasi berikut ke kueri GraphQL:

  • Permintaan yang berukuran lebih besar dari 100 kb atau dengan kedalaman kueri yang lebih besar dari 4 akan ditolak.
  • Permintaan ke sistem introspeksi akan ditolak.
  • Bidang /Missions/name dihapus dari permintaan yang berisi lebih dari dua header.
<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> 

Validasi mutasi

Contoh ini menerapkan aturan validasi dan otorisasi berikut ke mutasi GraphQL:

  • Permintaan yang berukuran lebih besar dari 100 kb atau dengan kedalaman kueri yang lebih besar dari 4 akan ditolak.
  • Permintaan untuk memutasi bidang deleteUser akan ditolak kecuali jika permintaan tersebut berasal dari alamat IP 198.51.100.1.
<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> 

Untuk informasi selengkapnya tentang bekerja dengan kebijakan, lihat: