Schema Functions
Schema FunctionsPHP Constants และตัวแปรสภาพแวดล้อมผ่าน Schema

PHP Constants และตัวแปรสภาพแวดล้อมผ่าน Schema

Included in the “Power Extensions” bundle

ดึงค่าจากตัวแปรสภาพแวดล้อมหรือค่าคงที่ PHP

คำอธิบาย

extension นี้เพิ่ม global field _env เข้าสู่ GraphQL schema ซึ่งช่วยให้สามารถดึงค่าจากตัวแปรสภาพแวดล้อม หรือจากค่าคงที่ PHP (ส่วนใหญ่กำหนดใน wp-config.php แต่สามารถกำหนดที่อื่นได้เช่นกัน)

ด้วยเหตุผลด้านความปลอดภัย ชื่อของตัวแปรสภาพแวดล้อมและค่าคงที่ที่สามารถเข้าถึงได้จะต้องได้รับการกำหนดค่าอย่างชัดเจน

Field _env รับชื่อของตัวแปรสภาพแวดล้อมหรือค่าคงที่ในพารามิเตอร์ "name" และแก้ไขดังนี้:

  • ถ้ามีตัวแปรสภาพแวดล้อมที่มีชื่อนั้น จะส่งคืนค่านั้น
  • มิฉะนั้น ถ้ามีค่าคงที่ที่มีชื่อนั้น จะส่งคืนค่านั้น
  • มิฉะนั้น จะส่งคืน null และเพิ่มข้อผิดพลาดไปยังผลลัพธ์ GraphQL

ตัวอย่างเช่น queries ต่อไปนี้ดึงค่าคงที่สภาพแวดล้อม GITHUB_ACCESS_TOKEN ที่เราอาจกำหนดขึ้นเพื่อเข้าถึง private repository บน GitHub:

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

queries นี้ดึงการกำหนดค่า DB ที่กำหนดในไฟล์ wp-config.php:

{
  dbName: _env(name: "DB_NAME")
  dbUser: _env(name: "DB_USER")
  dbPassword: _env(name: "DB_PASSWORD")
  dbHost: _env(name: "DB_HOST")
}

การกำหนดค่าการเข้าถึงค่าคงที่สภาพแวดล้อม

เราต้องกำหนดค่ารายการตัวแปรสภาพแวดล้อมและค่าคงที่ที่อนุญาตให้สามารถ queries ได้

แต่ละรายการสามารถเป็น:

  • Regex (regular expression) ถ้าล้อมรอบด้วย / หรือ #
  • ชื่อเต็มของตัวแปรหรือค่าคงที่ ในกรณีอื่น

ตัวอย่างเช่น รายการต่อไปนี้ตรงกับตัวแปรสภาพแวดล้อม "GITHUB_ACCESS_TOKEN":

  • GITHUB_ACCESS_TOKEN
  • #^([A-Z]*)_ACCESS_TOKEN$#
  • /GITHUB_(\S+)/

มี 2 ที่ที่สามารถกำหนดค่านี้ได้ตามลำดับความสำคัญ:

  1. Custom: ใน Schema Configuration ที่เกี่ยวข้อง
  2. ทั่วไป: ในหน้า Settings

ใน Schema Configuration ที่ใช้กับ endpoint เลือกตัวเลือก "Use custom configuration" แล้วป้อนรายการที่ต้องการ:

การกำหนดรายการใน Schema Configuration

มิฉะนั้น รายการที่กำหนดในแท็บ "Environment Fields" จาก Settings จะถูกใช้:

การกำหนดรายการใน Settings
การกำหนดรายการใน Settings

มี 2 พฤติกรรม คือ "Allow access" และ "Deny access":

  • Allow access: เฉพาะรายการที่กำหนดเท่านั้นที่สามารถเข้าถึงได้ รายการอื่นทั้งหมดไม่สามารถเข้าถึงได้
  • Deny access: รายการที่กำหนดไม่สามารถเข้าถึงได้ รายการอื่นทั้งหมดสามารถเข้าถึงได้
การกำหนดพฤติกรรมการเข้าถึง
การกำหนดพฤติกรรมการเข้าถึง

ความปลอดภัย: การเข้าถึงตัวแปรสภาพแวดล้อม

extension นี้บังคับใช้การป้องกันหลายชั้นเพื่อไม่ให้ข้อมูลที่ละเอียดอ่อนถูกเปิดเผย:

  • ผู้ใช้ต้องเข้าสู่ระบบ เพื่อเข้าถึง fields เหล่านี้

  • รายการตัวแปรสภาพแวดล้อมที่สามารถ queries ได้นั้นว่างเปล่าโดยค่าเริ่มต้น ดังนั้นจะไม่มีรายการใดที่อ่านได้จนกว่าจะได้รับการกำหนดค่าอย่างชัดเจน

  • ผู้ใช้ที่เป็น Admin มีสิทธิ์เข้าถึงตัวแปรสภาพแวดล้อมทั้งหมด

  • สำหรับผู้ใช้ที่ไม่ใช่ Admin ตัวแปรสภาพแวดล้อมต่อไปนี้จะถูกปฏิเสธการเข้าถึงเสมอ แม้จะได้รับอนุญาตอย่างชัดเจนในการกำหนดค่าก็ตาม:

    ตัวแปรสภาพแวดล้อม 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

    ตัวแปรสภาพแวดล้อมที่มี substrings เหล่านี้ในชื่อ:

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

ความปลอดภัย: การไม่เปิดเผยข้อมูลรับรอง

เว้นแต่ GraphQL API ของเราจะไม่ได้เปิดเผยต่อสาธารณะ (เช่น เมื่อสร้าง static site) เราต้องระวังไม่ให้ GraphQL query เปิดเผยข้อมูลส่วนตัว:

  • ในการตอบสนองของ query
  • ในผลลัพธ์เมื่อเกิดข้อผิดพลาด
  • ในบันทึก (logs)

ตัวอย่างเช่น queries ต่อไปนี้:

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

...จะพิมพ์ข้อมูลรับรองโดยตรงในการตอบสนอง:

{
  "data": {
    "githubAccessToken": "{some access token}"
  }
}

เราสามารถใช้ฟีเจอร์อื่นๆ ของ plugin เพื่อทำให้ GraphQL query ปลอดภัย:

  • Field to Input เพื่อนำค่าสภาพแวดล้อมไปใส่ใน field อื่นผ่าน dynamic variable
  • Field Response Removal เพื่อหลีกเลี่ยงการพิมพ์ค่าของตัวแปรสภาพแวดล้อมในผลลัพธ์
  • HTTP Client เพื่อเชื่อมต่อกับบริการภายนอกโดยตรงจากภายใน GraphQL query

ตัวอย่างเช่น queries ต่อไปนี้เชื่อมต่อกับ GitHub REST API โดยใช้ private access token:

{
  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
          },
        ]
      }
    }
  )
}

ใน queries นี้ fields githubAccessToken และ authorizationHeader (ซึ่งมีข้อมูลที่ละเอียดอ่อน) ถูกลบออกจากผลลัพธ์ทั้งคู่ และ field gitHubArtifactData จะพิมพ์ผลลัพธ์ของการเรียก API โดยไม่รั่วไหลข้อมูล input ใดๆ (เช่น เมื่อเกิดข้อผิดพลาด จะพิมพ์สตริง "$__authorizationHeader" แทนค่าของตัวแปร)