現在のElectronアプリケーションでは、アカウントごとのWebContentsViewにそれぞれ名前付きセッションを与えます。アプリの準備ができたら、メインプロセスの非同期ヘルパーで1つのビューを構成できます。

const routeSession = session.fromPartition(partitionName);
await routeSession.setProxy({
  mode: 'fixed_servers',
  proxyRules: `http://${proxyHost}:${proxyPort}`,
});
const view = new WebContentsView({
  webPreferences: { session: routeSession },
});
view.webContents.on('login', (event, details, authInfo, callback) => {
  if (!authInfo.isProxy
      || authInfo.scheme.toLowerCase() !== 'basic'
      || authInfo.host !== proxyHost
      || authInfo.port !== proxyPort) return;
  event.preventDefault();
  if (details.firstAuthAttempt) callback(proxyUser, proxyPassword);
  else callback();
});

分離したアカウントごとに別のpartitionNameを指定し、リスナー変数はそのビュー自身のクロージャに保持します。persist: を含まない名前はメモリ内セッションを作成します。同じパーティションを再利用すると、そのセッション状態を意図的に再利用します。

ビューを既存のウィンドウに接続し、プロキシとハンドラーの準備ができてからナビゲートします。コードはfirstAuthAttemptを含む現在のloginイベント契約を対象とし、拒否された再試行を同じアカウントで無限に再送信するのではなく取り消します。

ハンドラーは、チャレンジが意図したBasic HTTPプロキシからのものか確認します。ウェブサイトのログインはこの資格情報の対象ではありません。

プロキシルールがエンドポイントを選び、loginがアカウントを提供します。PACファイルと手動プロキシルール自体は、このcallbackのパスワードを保持しません。

これはHTTPプロキシ認証です。ChromiumにSOCKS5認証を追加するものではありません。既存のセッション接続も、後でルートを変更するときは通常のライフサイクル処理が必要です。

関連記事