Interagir avec l'API GraphQL
Interagir avec l'API GraphQLSécurité : éviter d'exposer les identifiants utilisés dans la requête

Sécurité : éviter d'exposer les identifiants utilisés dans la requête

À moins que notre API GraphQL ne soit pas exposée publiquement (comme lors de la construction d'un site statique), nous devons veiller à ce que la requête GraphQL n'expose pas de données privées :

  • Dans la réponse de la requête
  • Dans la sortie lorsqu'une erreur se produit
  • Dans les journaux

Par exemple, la requête suivante qui utilise le champ _env (fourni par le module Environment Fields) :

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}

...affichera directement les identifiants dans la réponse :

{
  "data": {
    "githubAccessToken": "{some access token}"
  }
}

Nous pouvons utiliser plusieurs fonctionnalités du plugin pour sécuriser la requête GraphQL :

  • Field to Input pour injecter la valeur d'environnement dans un autre champ via une variable dynamique
  • @remove Directive pour éviter d'afficher la valeur de la variable d'environnement dans la sortie
  • Send HTTP Request Fields pour se connecter directement à un service externe depuis la requête GraphQL

Par exemple, la requête suivante se connecte à l'API REST de GitHub en utilisant un token d'accès privé :

{
  githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
    # Cette directive supprimera cette entrée de la sortie
    @remove
 
  # Créer l'en-tête d'autorisation à envoyer à GitHub
  authorizationHeader: _sprintf(
    string: "Bearer %s",
    # Fonctionnalité "Field to Input" pour accéder à la valeur du champ ci-dessus
    values: [$__githubAccessToken]
  )
    # Ne pas afficher dans la sortie
    @remove
  
  # Utiliser le champ de "Send HTTP Request Fields" pour se connecter à 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"
            # Fonctionnalité "Field to Input" pour accéder à la valeur du champ ci-dessus
            value: $__authorizationHeader
          },
        ]
      }
    }
  )
}

Dans cette requête, les champs githubAccessToken et authorizationHeader (qui contiennent des données sensibles) sont tous deux supprimés de la sortie, et le champ gitHubArtifactData affichera déjà les résultats de l'appel API, sans divulguer aucun de ses inputs (ex. : une erreur affichera la chaîne "$__authorizationHeader" au lieu de la valeur de la variable).