Schema Functions
Schema FunctionsKonstanta PHP dan Variabel Lingkungan via Schema

Konstanta PHP dan Variabel Lingkungan via Schema

Included in the “Power Extensions” bundle

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 null dikembalikan 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:

  1. Kustom: Di Schema Configuration yang sesuai
  2. Umum: Di halaman Pengaturan

Di Schema Configuration yang diterapkan ke endpoint, pilih opsi "Use custom configuration" lalu masukkan entri yang diinginkan:

Mendefinisikan entri di Schema Configuration

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

Mendefinisikan entri di Pengaturan
Mendefinisikan entri di Pengaturan

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
Mendefinisikan perilaku akses
Mendefinisikan perilaku akses

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_KEY
    • SECURE_AUTH_KEY
    • LOGGED_IN_KEY
    • NONCE_KEY
    • AUTH_SALT
    • SECURE_AUTH_SALT
    • LOGGED_IN_SALT
    • NONCE_SALT
    • DB_NAME
    • DB_USER
    • DB_PASSWORD
    • DB_HOST
    • DB_CHARSET
    • DB_COLLATE

    Variabel lingkungan dengan salah satu substring ini dalam namanya:

    • PASSWORD
    • PASSWD
    • SECRET
    • PRIVATE_KEY
    • API_KEY
    • APIKEY
    • ACCESS_KEY
    • ACCESS_TOKEN
    • AUTH_TOKEN
    • BEARER
    • CREDENTIAL
    • SALT

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