Sicurezza: evitare di esporre le credenziali usate nella query
A meno che la nostra API GraphQL non sia esposta pubblicamente (come quando si crea un sito statico), dobbiamo fare attenzione affinché la query GraphQL non esponga dati privati:
- Nella risposta della query
- Nell'output quando si verifica un errore
- Nei log
Ad esempio, la seguente query che utilizza il campo _env (fornito dal modulo Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...stamperà direttamente le credenziali nella risposta:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Possiamo utilizzare diverse funzionalità del plugin per rendere sicura la query GraphQL:
- Field to Input per iniettare il valore dell'ambiente in un altro campo tramite una variabile dinamica
- @remove Directive per evitare di stampare il valore della variabile d'ambiente nell'output
- Send HTTP Request Fields per connettersi direttamente a un servizio esterno già dall'interno della query GraphQL
Ad esempio, la seguente query si connette all'API REST di GitHub utilizzando un token di accesso privato:
{
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
},
]
}
}
)
}In questa query, i campi githubAccessToken e authorizationHeader (che contengono dati sensibili) vengono entrambi rimossi dall'output, e il campo gitHubArtifactData stamperà già i risultati della chiamata API, senza divulgare nessuno dei suoi input (ad esempio: un errore stamperà la stringa "$__authorizationHeader" invece del valore della variabile).