Безопасность: не допускайте раскрытия учётных данных, используемых в запросе
Если наш GraphQL API публично доступен (например, при сборке статического сайта — напротив), необходимо следить за тем, чтобы GraphQL-запрос не раскрывал приватные данные:
- В ответе на запрос
- В выводе при возникновении ошибки
- В журналах (логах)
Например, следующий запрос, использующий поле _env (предоставляемое модулем Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...напрямую выведет учётные данные в ответе:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Для обеспечения безопасности GraphQL-запроса можно воспользоваться несколькими возможностями плагина:
- Field to Input — для передачи значения переменной окружения в другое поле через динамическую переменную
- @remove Directive — чтобы исключить вывод значения переменной окружения в результате
- Send HTTP Request Fields — для прямого подключения к внешнему сервису прямо внутри GraphQL-запроса
Например, следующий запрос подключается к GitHub REST API с использованием приватного токена доступа:
{
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
},
]
}
}
)
}В этом запросе поля githubAccessToken и authorizationHeader (содержащие конфиденциальные данные) оба исключаются из вывода, а поле gitHubArtifactData выводит результаты вызова API, не раскрывая ни одного из входных значений (например, при ошибке будет напечатана строка "$__authorizationHeader", а не значение переменной).