Funções do schema
Funções do schemaConstantes PHP e Variáveis de Ambiente via Schema

Constantes PHP e Variáveis de Ambiente via Schema

Included in the “Power Extensions” bundle

Consulta o valor de uma variável de ambiente ou constante PHP.

Descrição

Esta extensão adiciona o campo global _env ao schema GraphQL, que permite obter um valor de uma variável de ambiente, ou de uma constante PHP (mais comumente definida em wp-config.php, mas também pode ser definida em outro lugar).

Por razões de segurança, o nome da variável de ambiente e das constantes que podem ser acessadas deve ser configurado explicitamente.

O campo _env recebe o nome da variável de ambiente ou constante pelo parâmetro "name", e é resolvido da seguinte forma:

  • Se existir uma variável de ambiente com esse nome, ela é retornada
  • Caso contrário, se existir uma constante com esse nome, ela é retornada
  • Caso contrário, retorna null e adiciona um erro ao output GraphQL.

Por exemplo, esta query recupera a constante de ambiente GITHUB_ACCESS_TOKEN que podemos configurar para acessar um repositório privado no GitHub:

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

Esta query recupera a configuração do banco de dados definida no arquivo wp-config.php:

{
  dbName: _env(name: "DB_NAME")
  dbUser: _env(name: "DB_USER")
  dbPassword: _env(name: "DB_PASSWORD")
  dbHost: _env(name: "DB_HOST")
}

Configurando o acesso às constantes de ambiente

Devemos configurar a lista de variáveis de ambiente e constantes permitidas que podem ser consultadas.

Cada entrada pode ser:

  • Uma regex (expressão regular), se estiver entre / ou #, ou
  • O nome completo da variável ou constante, caso contrário

Por exemplo, qualquer uma destas entradas corresponde à variável de ambiente "GITHUB_ACCESS_TOKEN":

  • GITHUB_ACCESS_TOKEN
  • #^([A-Z]*)_ACCESS_TOKEN$#
  • /GITHUB_(\S+)/

Há 2 locais onde essa configuração pode ser feita, em ordem de prioridade:

  1. Personalizada: Na Schema Configuration correspondente
  2. Geral: Na página de Configurações

Na Schema Configuration aplicada ao endpoint, selecione a opção "Use custom configuration" e insira as entradas desejadas:

Definindo as entradas na Schema Configuration

Caso contrário, serão utilizadas as entradas definidas na aba "Environment Fields" das Configurações:

Definindo as entradas nas Configurações
Definindo as entradas nas Configurações

Há 2 comportamentos, "Allow access" e "Deny access":

  • Allow access: apenas as entradas configuradas podem ser acessadas, nenhuma outra pode
  • Deny access: as entradas configuradas não podem ser acessadas, todas as outras entradas podem
Definindo o comportamento de acesso
Definindo o comportamento de acesso

Segurança: Acessando variáveis de ambiente

A extensão aplica diversas camadas de proteção para evitar a exposição de dados sensíveis:

  • Os usuários devem estar autenticados para acessar esses campos.

  • A lista de variáveis de ambiente que podem ser consultadas está vazia por padrão, portanto nenhuma entrada é legível até ser configurada explicitamente.

  • Usuários admin têm acesso a todas as variáveis de ambiente.

  • Para usuários não admin, as seguintes variáveis de ambiente sempre têm o acesso negado — mesmo quando explicitamente permitidas na configuração:

    Variáveis de ambiente do WordPress:

    • AUTH_KEY
    • SECURE_AUTH_KEY
    • LOGGED_IN_KEY
    • NONCE_KEY
    • AUTH_SALT
    • SECURE_AUTH_SALT
    • LOGGED_IN_SALT
    • NONCE_SALT
    • DB_NAME
    • DB_USER
    • DB_PASSWORD
    • DB_HOST
    • DB_CHARSET
    • DB_COLLATE

    Variáveis de ambiente que contenham qualquer uma destas substrings em seu nome:

    • PASSWORD
    • PASSWD
    • SECRET
    • PRIVATE_KEY
    • API_KEY
    • APIKEY
    • ACCESS_KEY
    • ACCESS_TOKEN
    • AUTH_TOKEN
    • BEARER
    • CREDENTIAL
    • SALT

Segurança: Não expor credenciais

A menos que nossa API GraphQL não seja 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
  • No output quando ocorre um erro
  • Nos logs

Por exemplo, a seguinte query:

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

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

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

Podemos usar várias outras funcionalidades do plugin para tornar a query GraphQL segura:

  • Field to Input para injetar o valor de ambiente em outro campo via uma variável dinâmica
  • Field Response Removal para evitar imprimir o valor da variável de ambiente no output
  • HTTP Client 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 do output, e o campo gitHubArtifactData já imprimirá os resultados da chamada de API, sem expor nenhum dos seus inputs (por exemplo: um erro imprimirá a string "$__authorizationHeader" em vez do valor da variável).