การโต้ตอบกับ GraphQL APIความปลอดภัย: หลีกเลี่ยงการเปิดเผยข้อมูลรับรองที่ใช้ใน query
ความปลอดภัย: หลีกเลี่ยงการเปิดเผยข้อมูลรับรองที่ใช้ใน query
หากไม่ได้จำกัดการเข้าถึง GraphQL API (เช่น ในกรณีที่สร้างเว็บไซต์แบบ static) เราต้องระมัดระวังไม่ให้ GraphQL query เปิดเผยข้อมูลส่วนตัว:
- ในการตอบสนองของ query
- ในผลลัพธ์เมื่อเกิดข้อผิดพลาด
- ในบันทึกการทำงาน (logs)
ตัวอย่างเช่น query ต่อไปนี้ใช้ฟิลด์ _env (ที่ให้บริการโดยโมดูล Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...จะพิมพ์ข้อมูลรับรองลงในการตอบสนองโดยตรง:
{
"data": {
"githubAccessToken": "{some access token}"
}
}เราสามารถใช้ฟีเจอร์หลายอย่างในปลั๊กอินเพื่อทำให้ GraphQL query ปลอดภัย:
- Field to Input เพื่อนำค่าของตัวแปรสภาพแวดล้อมไปใส่ในฟิลด์อื่นผ่านตัวแปรแบบไดนามิก
- @remove Directive เพื่อหลีกเลี่ยงการแสดงค่าของตัวแปรสภาพแวดล้อมในผลลัพธ์
- Send HTTP Request Fields เพื่อเชื่อมต่อกับบริการภายนอกโดยตรงจากภายใน GraphQL query
ตัวอย่างเช่น query ต่อไปนี้เชื่อมต่อกับ GitHub REST API โดยใช้ 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
},
]
}
}
)
}ใน query นี้ ฟิลด์ githubAccessToken และ authorizationHeader (ซึ่งมีข้อมูลที่ละเอียดอ่อน) ถูกลบออกจากผลลัพธ์ทั้งคู่ และฟิลด์ gitHubArtifactData จะแสดงเฉพาะผลลัพธ์ของการเรียก API โดยไม่เปิดเผยข้อมูล input ใดๆ (เช่น เมื่อเกิดข้อผิดพลาด จะแสดงสตริง "$__authorizationHeader" แทนค่าของตัวแปร)