Interakcja z API GraphQL
Interakcja z API GraphQLBezpieczeństwo: unikanie ujawniania danych uwierzytelniających używanych w query

Bezpieczeństwo: unikanie ujawniania danych uwierzytelniających używanych w query

O ile nasze API GraphQL nie jest publicznie niedostępne (na przykład podczas budowania strony statycznej), musimy uważać, aby query GraphQL nie ujawniało prywatnych danych:

  • W odpowiedzi query
  • W danych wyjściowych, gdy wystąpi błąd
  • W logach

Na przykład następująca query używająca pola _env (dostarczonego przez moduł Environment Fields):

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

...wydrukuje dane uwierzytelniające bezpośrednio w odpowiedzi:

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

Możemy skorzystać z kilku funkcji wtyczki, aby uczynić query GraphQL bezpiecznym:

  • Field to Input — aby wstrzyknąć wartość środowiskową do innego pola za pośrednictwem zmiennej dynamicznej
  • @remove Directive — aby uniknąć drukowania wartości zmiennej środowiskowej w danych wyjściowych
  • Send HTTP Request Fields — aby połączyć się bezpośrednio z zewnętrzną usługą już z poziomu query GraphQL

Na przykład następująca query łączy się z interfejsem API REST GitHub przy użyciu prywatnego tokenu dostępu:

{
  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
          },
        ]
      }
    }
  )
}

W tej query pola githubAccessToken i authorizationHeader (zawierające wrażliwe dane) są oba usuwane z danych wyjściowych, a pole gitHubArtifactData wydrukuje już wyniki wywołania API bez ujawniania żadnych danych wejściowych (np. błąd wydrukuje ciąg "$__authorizationHeader" zamiast wartości zmiennej).