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).