PHP Constants และตัวแปรสภาพแวดล้อมผ่าน Schema
ดึงค่าจากตัวแปรสภาพแวดล้อมหรือค่าคงที่ 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 ที่ที่สามารถกำหนดค่านี้ได้ตามลำดับความสำคัญ:
- Custom: ใน Schema Configuration ที่เกี่ยวข้อง
- ทั่วไป: ในหน้า Settings
ใน Schema Configuration ที่ใช้กับ endpoint เลือกตัวเลือก "Use custom configuration" แล้วป้อนรายการที่ต้องการ:

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

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

ความปลอดภัย: การเข้าถึงตัวแปรสภาพแวดล้อม
extension นี้บังคับใช้การป้องกันหลายชั้นเพื่อไม่ให้ข้อมูลที่ละเอียดอ่อนถูกเปิดเผย:
-
ผู้ใช้ต้องเข้าสู่ระบบ เพื่อเข้าถึง fields เหล่านี้
-
รายการตัวแปรสภาพแวดล้อมที่สามารถ queries ได้นั้นว่างเปล่าโดยค่าเริ่มต้น ดังนั้นจะไม่มีรายการใดที่อ่านได้จนกว่าจะได้รับการกำหนดค่าอย่างชัดเจน
-
ผู้ใช้ที่เป็น Admin มีสิทธิ์เข้าถึงตัวแปรสภาพแวดล้อมทั้งหมด
-
สำหรับผู้ใช้ที่ไม่ใช่ Admin ตัวแปรสภาพแวดล้อมต่อไปนี้จะถูกปฏิเสธการเข้าถึงเสมอ แม้จะได้รับอนุญาตอย่างชัดเจนในการกำหนดค่าก็ตาม:
ตัวแปรสภาพแวดล้อม WordPress:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
ตัวแปรสภาพแวดล้อมที่มี substrings เหล่านี้ในชื่อ:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
ความปลอดภัย: การไม่เปิดเผยข้อมูลรับรอง
เว้นแต่ 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" แทนค่าของตัวแปร)