Schema Functions
Schema Functionsスキーマを介したPHP定数と環境変数

スキーマを介したPHP定数と環境変数

Included in the “Power Extensions” bundle

環境変数またはPHP定数の値をクエリします。

説明

この拡張機能はGraphQLスキーマにグローバルフィールド _env を追加します。これにより、環境変数またはPHP定数(主に wp-config.php で定義されますが、他の場所でも定義できます)から値を取得できます。

セキュリティ上の理由から、アクセスできる環境変数と定数の名前は明示的に設定する必要があります。

フィールド _env はパラメータ "name" に環境変数または定数の名前を受け取り、次のように解決されます:

  • その名前の環境変数が存在する場合、それを返します
  • そうでない場合、その名前の定数が存在すれば、それを返します
  • そうでない場合、null を返し、GraphQL出力にエラーを追加します。

例えば、次のクエリはGitHubのプライベートリポジトリへのアクセス用に設定した環境定数 GITHUB_ACCESS_TOKEN を取得します:

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

このクエリは wp-config.php ファイルで定義されたDBの設定を取得します:

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

環境定数へのアクセスの設定

クエリ可能な環境変数と定数の許可リストを設定する必要があります。

各エントリは次のいずれかになります:

  • / または # で囲まれている場合は、正規表現(regex)
  • それ以外の場合は、変数または定数のフルネーム

例えば、次のいずれかのエントリは環境変数 "GITHUB_ACCESS_TOKEN" に一致します:

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

この設定を行える場所は優先度順に2か所あります:

  1. カスタム:対応するSchema Configuration内
  2. 全般:設定ページ内

エンドポイントに適用されているSchema Configurationで、オプション "Use custom configuration" を選択し、目的のエントリを入力します:

Schema Configurationでエントリを定義する

それ以外の場合は、設定の「Environment Fields」タブで定義されたエントリが使用されます:

設定でエントリを定義する
設定でエントリを定義する

「Allow access」と「Deny access」の2つの動作があります:

  • Allow access: 設定されたエントリのみアクセス可能で、それ以外はアクセスできません
  • Deny access: 設定されたエントリにはアクセスできず、それ以外のすべてのエントリにはアクセスできます
アクセスの動作を定義する
アクセスの動作を定義する

セキュリティ:環境変数へのアクセス

この拡張機能は、機密データが公開されないよう複数の保護レイヤーを適用します:

  • ユーザーはログイン済みである必要があります。これらのフィールドにアクセスするためには認証が必要です。

  • クエリ可能な環境変数のリストはデフォルトで空です。明示的に設定されるまで、いかなるエントリも読み取れません。

  • 管理者ユーザーはすべての環境変数にアクセスできます。

  • 管理者以外のユーザーの場合、設定で明示的に許可されていても、次の環境変数は常にアクセスが拒否されます:

    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

    名前にこれらのサブ文字列のいずれかを含む環境変数:

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

セキュリティ:認証情報を公開しない

GraphQL APIが公開されている場合(静的サイトのビルド時などは除く)、GraphQLクエリがプライベートデータを公開しないよう注意が必要です:

  • クエリのレスポンスに含める場合
  • エラー発生時の出力に含める場合
  • ログに含める場合

例えば、次のクエリ:

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

...はレスポンスに直接認証情報を出力します:

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

プラグインの他の機能を使って、GraphQLクエリを安全にすることができます:

  • Field to Input:動的変数を通じて環境変数の値を別のフィールドに注入します
  • Field Response Removal:環境変数の値が出力に表示されないようにします
  • HTTP Client:GraphQLクエリ内から直接外部サービスに接続します

例えば、次のクエリはプライベートアクセストークンを使用して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
          },
        ]
      }
    }
  )
}

このクエリでは、機密データを含むフィールド githubAccessTokenauthorizationHeader の両方が出力から削除されます。フィールド gitHubArtifactData はAPI呼び出しの結果を出力しますが、その入力値(例:エラーが発生した場合、変数の値ではなく文字列 "$__authorizationHeader" が出力されます)は漏洩しません。