GraphQL APIとのインタラクション
GraphQL APIとのインタラクションセキュリティ: クエリで使用する認証情報の漏洩を防ぐ

セキュリティ: クエリで使用する認証情報の漏洩を防ぐ

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

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

例えば、Environment Fieldsモジュールが提供するフィールド_envを使用する以下のクエリは:

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

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

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

プラグインのいくつかの機能を使用することで、GraphQLクエリを安全にすることができます:

  • Field to Input:動的変数を通じて環境変数の値を別のフィールドに注入する
  • @remove Directive:環境変数の値が出力に表示されないようにする
  • Send HTTP Request Fields: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"が表示されます)は漏洩しません。