Sicherheit: Anmeldedaten in der Query nicht preisgeben
Sofern unsere GraphQL-API nicht öffentlich zugänglich ist (z. B. beim Erstellen einer statischen Website), müssen wir darauf achten, dass die GraphQL-Query keine privaten Daten preisgibt:
- In der Antwort der Query
- In der Ausgabe, wenn ein Fehler auftritt
- In den Logs
Die folgende Query verwendet beispielsweise das Feld _env (bereitgestellt durch das Modul Environment Fields):
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...und gibt die Anmeldedaten direkt in der Antwort aus:
{
"data": {
"githubAccessToken": "{some access token}"
}
}Wir können verschiedene Funktionen des Plugins nutzen, um die GraphQL-Query abzusichern:
- Field to Input, um den Umgebungswert über eine dynamische Variable in ein anderes Feld einzufügen
- @remove Directive, um zu verhindern, dass der Wert der Umgebungsvariable in der Ausgabe erscheint
- Send HTTP Request Fields, um direkt aus der GraphQL-Query heraus eine Verbindung zu einem externen Dienst herzustellen
Die folgende Query verbindet sich zum Beispiel über ein privates Zugriffstoken mit der GitHub REST API:
{
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 dieser Query werden die Felder githubAccessToken und authorizationHeader (die sensible Daten enthalten) beide aus der Ausgabe entfernt, und das Feld gitHubArtifactData gibt bereits die Ergebnisse des API-Aufrufs aus, ohne seine Eingaben preiszugeben (z. B. gibt ein Fehler den String "$__authorizationHeader" statt des tatsächlichen Variablenwerts aus).