การโต้ตอบกับ GraphQL API
การโต้ตอบกับ 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" แทนค่าของตัวแปร)