Interagindo com a API GraphQL
Interagindo com a API GraphQLSegurança: evitar expor credenciais usadas na query

Segurança: evitar expor credenciais usadas na query

A menos que nossa API GraphQL não esteja exposta publicamente (como ao construir um site estático), devemos ter cuidado para que a query GraphQL não exponha dados privados:

  • Na resposta da query
  • Na saída quando ocorre um erro
  • Nos logs

Por exemplo, a seguinte query que usa o campo _env (fornecido pelo módulo Environment Fields):

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

...irá imprimir diretamente as credenciais na resposta:

{
  "data": {
    "githubAccessToken": "{some access token}"
  }
}

Podemos usar diversos recursos do plugin para tornar a query GraphQL segura:

  • Field to Input para injetar o valor do ambiente em outro campo via uma variável dinâmica
  • @remove Directive para evitar imprimir o valor da variável de ambiente na saída
  • Send HTTP Request Fields para conectar diretamente a um serviço externo já de dentro da query GraphQL

Por exemplo, a seguinte query conecta à API REST do GitHub usando um token de acesso privado:

{
  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
          },
        ]
      }
    }
  )
}

Nesta query, os campos githubAccessToken e authorizationHeader (que contêm dados sensíveis) são ambos removidos da saída, e o campo gitHubArtifactData já imprimirá os resultados da chamada de API, sem vazar nenhum de seus inputs (ex.: um erro imprimirá a string "$__authorizationHeader" em vez do valor da variável).