Constantes PHP e Variáveis de Ambiente via Schema
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
nulle 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:
- Personalizada: Na Schema Configuration correspondente
- 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:

Caso contrário, serão utilizadas as entradas definidas na aba "Environment Fields" das 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

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_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
Variáveis de ambiente que contenham qualquer uma destas substrings em seu nome:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
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).