Bảo mật: Tránh để lộ thông tin xác thực dùng trong query
Trừ khi GraphQL API của chúng ta không được công khai (chẳng hạn khi xây dựng một trang web tĩnh), chúng ta phải cẩn thận để query GraphQL không làm lộ dữ liệu riêng tư:
- Trong phản hồi của query
- Trong đầu ra khi xảy ra lỗi
- Trong các bản ghi nhật ký (logs)
Ví dụ, query sau đây sử dụng trường _env (do module Environment Fields cung cấp):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...sẽ in trực tiếp thông tin xác thực vào phản hồi:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Chúng ta có thể sử dụng một số tính năng trong plugin để bảo mật query GraphQL:
- Field to Input để đưa giá trị biến môi trường vào một trường khác thông qua biến động
- @remove Directive để tránh in giá trị của biến môi trường ra đầu ra
- Send HTTP Request Fields để kết nối trực tiếp với dịch vụ bên ngoài ngay từ bên trong query GraphQL
Ví dụ, query sau đây kết nối với GitHub REST API bằng cách sử dụng một token truy cập riêng tư:
{
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
},
]
}
}
)
}Trong query này, các trường githubAccessToken và authorizationHeader (chứa dữ liệu nhạy cảm) đều bị loại bỏ khỏi đầu ra, và trường gitHubArtifactData sẽ in kết quả của lệnh gọi API mà không để lộ bất kỳ dữ liệu đầu vào nào (ví dụ: một lỗi sẽ in chuỗi "$__authorizationHeader" thay vì giá trị thực của biến).