Mit der GraphQL API interagieren
Mit der GraphQL API interagierenSicherheit: Anmeldedaten in der Query nicht preisgeben

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