Konstanta PHP dan Variabel Lingkungan via Schema
Query nilai dari variabel lingkungan atau konstanta PHP.
Deskripsi
Ekstensi ini menambahkan field global _env ke skema GraphQL, yang memungkinkan untuk mendapatkan nilai dari variabel lingkungan, atau dari konstanta PHP (paling umum didefinisikan di wp-config.php, tetapi juga dapat didefinisikan di tempat lain).
Karena alasan keamanan, nama variabel lingkungan dan konstanta yang dapat diakses harus dikonfigurasi secara eksplisit.
Field _env menerima nama variabel lingkungan atau konstanta melalui parameter "name", dan diselesaikan seperti ini:
- Jika ada variabel lingkungan dengan nama tersebut, maka nilai tersebut dikembalikan
- Jika tidak, jika ada konstanta dengan nama tersebut, maka nilai tersebut dikembalikan
- Jika tidak, nilai
nulldikembalikan dan error ditambahkan ke output GraphQL.
Misalnya, query ini mengambil konstanta lingkungan GITHUB_ACCESS_TOKEN yang mungkin kita siapkan untuk mengakses repositori privat di GitHub:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}Query ini mengambil konfigurasi DB yang didefinisikan di file wp-config.php:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}Mengonfigurasi akses ke konstanta lingkungan
Kita harus mengonfigurasi daftar variabel lingkungan dan konstanta yang diizinkan untuk di-query.
Setiap entri dapat berupa:
- Sebuah regex (ekspresi reguler), jika dikelilingi oleh
/atau#, atau - Nama lengkap variabel atau konstanta, selain itu
Misalnya, salah satu entri ini cocok dengan variabel lingkungan "GITHUB_ACCESS_TOKEN":
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
Ada 2 tempat di mana konfigurasi ini dapat dilakukan, berdasarkan urutan prioritas:
- Kustom: Di Schema Configuration yang sesuai
- Umum: Di halaman Pengaturan
Di Schema Configuration yang diterapkan ke endpoint, pilih opsi "Use custom configuration" lalu masukkan entri yang diinginkan:

Jika tidak, entri yang didefinisikan di tab "Environment Fields" dari Pengaturan akan digunakan:

Ada 2 perilaku, "Allow access" dan "Deny access":
- Allow access: hanya entri yang dikonfigurasi yang dapat diakses, tidak ada yang lain
- Deny access: entri yang dikonfigurasi tidak dapat diakses, semua entri lain dapat diakses

Keamanan: Mengakses variabel lingkungan
Ekstensi ini menerapkan beberapa lapisan perlindungan agar data sensitif tidak terekspos:
-
Pengguna harus masuk (login) untuk mengakses field-field ini.
-
Daftar variabel lingkungan yang dapat di-query kosong secara default, sehingga tidak ada entri yang dapat dibaca sampai dikonfigurasi secara eksplisit.
-
Pengguna admin memiliki akses ke semua variabel lingkungan.
-
Untuk pengguna non-admin, variabel lingkungan berikut selalu ditolak aksesnya — bahkan ketika secara eksplisit diizinkan dalam konfigurasi:
Variabel lingkungan WordPress:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Variabel lingkungan dengan salah satu substring ini dalam namanya:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
Keamanan: Tidak mengekspos kredensial
Kecuali API GraphQL kita tidak terekspos secara publik (seperti ketika membangun situs statis), kita harus berhati-hati agar query GraphQL tidak mengekspos data privat:
- Dalam respons query
- Dalam output ketika terjadi error
- Dalam log
Misalnya, query berikut:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...akan langsung mencetak kredensial dalam respons:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Kita dapat menggunakan beberapa fitur lain dalam plugin untuk membuat query GraphQL menjadi aman:
- Field to Input untuk menyuntikkan nilai lingkungan ke field lain melalui variabel dinamis
- Field Response Removal untuk menghindari pencetakan nilai variabel lingkungan pada output
- HTTP Client untuk langsung terhubung ke layanan eksternal dari dalam query GraphQL
Misalnya, query berikut terhubung ke GitHub REST API menggunakan token akses privat:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
# This directive will remove this entry from the output
@remove
# Create the authorization header to send to GitHub
authorizationHeader: _sprintf(
string: "Bearer %s",
# "Field to Input" feature to access value from the field above
values: [$__githubAccessToken]
)
# Do not print in output
@remove
# Use the field from "Send HTTP Request Fields" to connect to GitHub
gitHubArtifactData: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL/actions/artifacts",
options: {
headers: [
{
name: "Accept"
value: "application/vnd.github+json"
},
{
name: "Authorization"
# "Field to Input" feature to access value from the field above
value: $__authorizationHeader
},
]
}
}
)
}Dalam query ini, field githubAccessToken dan authorizationHeader (yang berisi data sensitif) keduanya dihapus dari output, dan field gitHubArtifactData akan langsung mencetak hasil panggilan API, tanpa membocorkan input apa pun (misalnya: sebuah error akan mencetak string "$__authorizationHeader" alih-alih nilai variabel tersebut).