Funkcje schematu
Funkcje schematuStałe PHP i Zmienne Środowiskowe via Schema

Stałe PHP i Zmienne Środowiskowe via Schema

Included in the “Power Extensions” bundle

Pobiera wartość ze zmiennej środowiskowej lub stałej PHP.

Opis

To rozszerzenie dodaje globalne pole _env do schematu GraphQL, które umożliwia pobranie wartości ze zmiennej środowiskowej lub ze stałej PHP (najczęściej zdefiniowanej w pliku wp-config.php, ale może być zdefiniowana również w innym miejscu).

Ze względów bezpieczeństwa nazwa zmiennej środowiskowej i stałych, do których można uzyskać dostęp, musi być jawnie skonfigurowana.

Pole _env przyjmuje nazwę zmiennej środowiskowej lub stałej przez parametr "name" i jest rozwiązywane w następujący sposób:

  • Jeśli istnieje zmienna środowiskowa o tej nazwie, jest zwracana
  • W przeciwnym razie, jeśli istnieje stała o tej nazwie, jest zwracana
  • W przeciwnym razie zwraca null i dodaje błąd do wyników GraphQL.

Na przykład poniższe query pobiera stałą środowiskową GITHUB_ACCESS_TOKEN, którą możemy skonfigurować w celu uzyskania dostępu do prywatnego repozytorium na GitHub:

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

To query pobiera konfigurację bazy danych zdefiniowaną w pliku wp-config.php:

{
  dbName: _env(name: "DB_NAME")
  dbUser: _env(name: "DB_USER")
  dbPassword: _env(name: "DB_PASSWORD")
  dbHost: _env(name: "DB_HOST")
}

Konfigurowanie dostępu do stałych środowiskowych

Należy skonfigurować listę dozwolonych zmiennych środowiskowych i stałych, które mogą być odpytywane.

Każdy wpis może być:

  • Wyrażeniem regularnym (regex), jeśli jest otoczony / lub #, lub
  • Pełną nazwą zmiennej lub stałej, w przeciwnym razie

Na przykład dowolny z poniższych wpisów pasuje do zmiennej środowiskowej "GITHUB_ACCESS_TOKEN":

  • GITHUB_ACCESS_TOKEN
  • #^([A-Z]*)_ACCESS_TOKEN$#
  • /GITHUB_(\S+)/

Istnieją 2 miejsca, w których można przeprowadzić tę konfigurację, według kolejności priorytetów:

  1. Niestandardowa: W odpowiedniej Konfiguracji Schematu
  2. Ogólna: Na stronie Ustawień

W Konfiguracji Schematu zastosowanej do endpointu wybierz opcję "Use custom configuration" i wprowadź żądane wpisy:

Definiowanie wpisów w Konfiguracji Schematu

W przeciwnym razie zostaną użyte wpisy zdefiniowane w zakładce "Environment Fields" w Ustawieniach:

Definiowanie wpisów w Ustawieniach
Definiowanie wpisów w Ustawieniach

Istnieją 2 zachowania, "Allow access" i "Deny access":

  • Allow access: dostęp mają tylko skonfigurowane wpisy, żadne inne nie mogą
  • Deny access: skonfigurowane wpisy nie mogą być dostępne, wszystkie inne wpisy mogą
Definiowanie zachowania dostępu
Definiowanie zachowania dostępu

Bezpieczeństwo: Dostęp do zmiennych środowiskowych

Rozszerzenie stosuje kilka warstw ochrony, aby zapobiec ujawnieniu wrażliwych danych:

  • Użytkownicy muszą być zalogowani, aby uzyskać dostęp do tych pól.

  • Lista zmiennych środowiskowych, które mogą być odpytywane, jest domyślnie pusta, więc żadne wpisy nie są odczytywalne, dopóki nie zostaną jawnie skonfigurowane.

  • Użytkownicy admin mają dostęp do wszystkich zmiennych środowiskowych.

  • Dla użytkowników niebędących adminami następujące zmienne środowiskowe mają zawsze odmowę dostępu — nawet gdy są jawnie dozwolone w konfiguracji:

    Zmienne środowiskowe WordPress:

    • AUTH_KEY
    • SECURE_AUTH_KEY
    • LOGGED_IN_KEY
    • NONCE_KEY
    • AUTH_SALT
    • SECURE_AUTH_SALT
    • LOGGED_IN_SALT
    • NONCE_SALT
    • DB_NAME
    • DB_USER
    • DB_PASSWORD
    • DB_HOST
    • DB_CHARSET
    • DB_COLLATE

    Zmienne środowiskowe zawierające którykolwiek z tych podciągów w nazwie:

    • PASSWORD
    • PASSWD
    • SECRET
    • PRIVATE_KEY
    • API_KEY
    • APIKEY
    • ACCESS_KEY
    • ACCESS_TOKEN
    • AUTH_TOKEN
    • BEARER
    • CREDENTIAL
    • SALT

Bezpieczeństwo: Nieujawnianie danych uwierzytelniających

O ile nasze API GraphQL nie jest niepublicznie udostępnione (na przykład przy budowaniu strony statycznej), należy zadbać o to, aby query GraphQL nie ujawniało prywatnych danych:

  • W odpowiedzi query
  • W wynikach, gdy wystąpi błąd
  • W logach

Na przykład następujące query:

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

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

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

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

  • Field to Input do wstrzykiwania wartości środowiskowej do innego pola za pomocą zmiennej dynamicznej
  • Field Response Removal aby uniknąć drukowania wartości zmiennej środowiskowej w wynikach
  • HTTP Client do bezpośredniego połączenia z zewnętrzną usługą już z poziomu query GraphQL

Na przykład poniższe query łączy się z API REST GitHub za pomocą prywatnego tokena 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 tym query pola githubAccessToken i authorizationHeader (które zawierają wrażliwe dane) są oba usuwane z wyników, a pole gitHubArtifactData wydrukuje już rezultaty wywołania API, nie ujawniając żadnych jego danych wejściowych (np. błąd wydrukuje ciąg "$__authorizationHeader" zamiast wartości zmiennej).