Mengekspos endpoint publik dan privat
GraphQL secara tradisional berkaitan dengan pengeksposean satu endpoint tunggal, biasanya di bawah https://mysite.com/graphql.
Gato GraphQL memperluas konsep ini, memungkinkan kita mengekspos beberapa endpoint kustom, masing-masing disesuaikan dengan kebutuhan tertentu. Misalnya, kita dapat mengekspos endpoint:
/internaldan/public/apps/mobiledan/apps/website/clientsdan/visitors/development,/stagingdan/production/teams/development,/teams/testingdan/teams/marketing/clients/A,/clients/Bdanclients/Z- kombinasi apa pun dari mereka
Gato GraphQL juga mendukung Persisted Queries, yaitu endpoint di mana GraphQL query sudah ditentukan sebelumnya dan disimpan di server.
Panduan ini menyajikan saran tentang cara dan kapan menggunakan setiap endpoint.
Selain mengamankan endpoint API Gato GraphQL Anda, kami merekomendasikan agar Anda selalu memperkuat keamanan situs WordPress Anda menggunakan plugin keamanan khusus, seperti WP Security Ninja.
Endpoint dikonfigurasi melalui sebuah Konfigurasi Skema, di mana kita menentukan:
- Mengatur skema sebagai publik atau privat
- Mengaktifkan elemen data "sensitif"
- Menerapkan namespacing pada skema
- Menggunakan nested mutations
- Mendefinisikan header respons
- Memberikan akses ke elemen skema melalui Access Control Lists
- Mengatur HTTP caching
- Dan banyak lagi
Jika kita memiliki konfigurasi yang ingin diterapkan ke semua atau sebagian besar endpoint, kita dapat mendefinisikan sebuah Konfigurasi Skema default.
Kapan menggunakan single endpoint
Single endpoint selalu bersifat publik, diekspos secara default di bawah /graphql.
Gato GraphQL dikelola melalui "modul", masing-masing menawarkan beberapa fungsionalitas atau ekstensi dari skema GraphQL, dan yang dapat diaktifkan dan dinonaktifkan sesuai kebutuhan.
Untuk memperkuat keamanan API kita, adalah praktik yang baik untuk menonaktifkan modul yang memperluas skema GraphQL (seperti modul "Posts", "Users", "Comments", "Blocks", dll.) ketika tidak diperlukan, sehingga memastikan bahwa data tersebut tidak akan pernah diekspos sejak awal.
Khususnya, jika API tidak dimaksudkan untuk memutasi data (yaitu membuat atau memperbarui sumber daya), adalah praktik yang baik untuk menonaktifkan modul "Mutations". Melakukan hal ini akan menonaktifkan semua ekstensi yang menyediakan mutation (seperti modul "Post Mutations", "Comment Mutations", dll.), dan mutation tersebut tidak akan pernah diekspos dalam skema GraphQL.
Single endpoint direkomendasikan ketika:
- Kita perlu mengambil data untuk mendukung satu fitur, dan
- Situs WordPress tidak dapat diakses dari Internet publik (yaitu sedang berjalan di laptop pengembangan, atau di balik firewall)
Ini adalah kasusnya, misalnya, untuk membangun situs headless (menggunakan Next.js, Gatsby, atau lainnya).
Kapan menggunakan custom endpoint publik
Custom endpoint mirip dengan single endpoint, tetapi kita dapat memiliki banyak dari mereka, masing-masing diekspos di bawah URL-nya sendiri graphql/{custom-endpoint-slug}/, dengan masing-masing memiliki konfigurasi yang berbeda.
Custom endpoint menawarkan keamanan melalui ketidakjelasan, karena hanya target yang dituju yang seharusnya mengetahui keberadaan custom endpoint dan URL-nya.
Untuk memperketat keamanan API, kita dapat menggunakan ekstensi Access Control untuk memberikan akses ke endpoint hanya ketika:
- Pengguna sudah login (atau tidak)
- Pengguna memiliki peran tertentu
- Pengguna memiliki kapabilitas tertentu
- Pengunjung berasal dari IP yang diizinkan (melalui ekstensi Access Control: Visitor IP)
Setiap custom endpoint dapat memiliki Access Control List-nya sendiri, sehingga hanya dapat diakses oleh pengguna tertentu yang dituju.
Custom endpoint direkomendasikan ketika kita perlu mengelola dan menyesuaikan akses ke API, baik oleh aplikasi yang berbeda, tim, klien, atau pihak lainnya.
Kapan menggunakan custom endpoint privat
Gato GraphQL mengimplementasikan custom endpoint melalui Custom Post Types (CPTs). Ini memungkinkan kita untuk menerbitkan custom endpoint sebagai privat (dan juga sebagai dilindungi kata sandi), sehingga membuat custom endpoint hanya dapat diakses oleh pengguna yang sudah login dan memiliki hak untuk mengakses custom post tersebut, dan tidak oleh siapa pun lainnya.
Metode ini direkomendasikan ketika GraphQL endpoint dimaksudkan untuk digunakan hanya oleh admin situs (seperti saat menggunakan GraphQL untuk menjalankan tugas-tugas admin). Dengan sepenuhnya memblokir pengunjung luar dari mengakses endpoint, kita akan memperketat keamanan situs.
Kapan menggunakan Persisted Queries publik
Persisted queries adalah endpoint, masing-masing memiliki URL-nya sendiri, tetapi GraphQL query sudah ditentukan di sisi server, sehingga responsnya juga sudah ditentukan sebelumnya (dapat dibuat dinamis dengan mendefinisikan variabel, yang dipenuhi oleh parameter URL).
Persisted queries mirip dengan endpoint REST, tetapi kita menggunakan bahasa GraphQL untuk menyusun query, dan kita dapat menerbitkannya langsung dari wp-admin. Tidak perlu men-deploy kode PHP apa pun untuk menerbitkan persisted query.
Karena persisted queries tidak memerlukan pengiriman GraphQL query dalam body permintaan, mereka secara alami cocok untuk diakses melalui GET daripada POST.
(Single endpoint dan custom endpoint juga dapat diakses melalui GET dengan menambahkan parameter ?query={ GraphQL query } ke endpoint.)
Kita dapat memanfaatkan ini dan membuat API lebih cepat melalui HTTP Caching standar, menyimpan respons GraphQL di sisi klien atau tahap perantara antara klien dan server (seperti CDN).
Hal ini dicapai melalui ekstensi Cache Control, yang secara otomatis menghitung dan mengeluarkan nilai max-age respons berdasarkan field dan directive yang ada dalam query.
Direkomendasikan untuk menggunakan persisted queries kapan pun memungkinkan, karena mereka secara substansial meningkatkan keamanan situs kita.
Hal ini karena semua data yang perlu tersedia untuk aplikasi kita sudah dapat diekspos melalui persisted queries. Kemudian, kita dapat melewati pengeksposean single endpoint GraphQL (atau custom endpoint apa pun), sehingga menghilangkan kemungkinan pengguna mengakses data privat yang kita biarkan terekspos (secara tidak sengaja atau sebaliknya).
Kapan menggunakan Persisted Queries privat
Mirip dengan custom endpoint, persisted queries adalah CPTs, sehingga kita dapat menerbitkannya sebagai privat (atau dilindungi kata sandi), membuatnya hanya dapat diakses oleh pengguna yang sudah login dan memiliki hak untuk mengaksesnya, dan tidak oleh siapa pun lainnya.
Direkomendasikan untuk menggunakan ini kapan pun query dimaksudkan hanya untuk penggunaan internal, seperti saat mencari data WordPress untuk keperluan sendiri.