Взаимодействие с GraphQL API
Взаимодействие с GraphQL APIБезопасность: не допускайте раскрытия учётных данных, используемых в запросе

Безопасность: не допускайте раскрытия учётных данных, используемых в запросе

Если наш 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", а не значение переменной).