プロキシ プロファイルの切り替えでは、選択されたアカウントを変更すべきであり、onAuthRequired リスナーをさらに追加してはいけません。そうしないと、古いクロージャが以前の選択時のアカウントで応答し続ける可能性があります。

サービス ワーカーの最上位で、名前付きリスナーを1つ登録します。イベントが到着したときに現在のアカウントを読み取ります。

function answerProxyChallenge(details, reply) {
  if (!details.isProxy) {
    reply({});
    return;
  }
  chrome.storage.session.get('selectedProxy').then(({selectedProxy: p}) => {
    if (!p || details.challenger.host !== p.host ||
        details.challenger.port !== p.port) {
      reply({});
      return;
    }
    reply({authCredentials: {username: p.username, password: p.password}});
  }).catch(() => reply({cancel: true}));
}

chrome.webRequest.onAuthRequired.addListener(
  answerProxyChallenge,
  {urls: ['<all_urls>']},
  ['asyncBlocking'],
);

この断片は、拡張機能が選択済みの HTTP プロキシを selectedProxy の下に、数値のポートと想定されたアカウントとともにすでに保存していることを前提としています。マニフェストには webRequest、webRequestAuthProvider、storage、および必要なホスト権限が必要です。プロキシの選択自体にも proxy 権限が必要です。

登録は同期的に行われます。ストレージはコールバック内で、Chrome が配送先のリスナーをインストールした後に読み取られます。最初の storage プロミスが解決してから登録すると、起動の隙間が生じます。

リリース前に拒否上限を追加する

この断片は登録とアカウント選択を示しています。拒否されたパスワードが無期限に送信されないよう、リクエストごとに上限付きの再試行記録を追加してください。完了時または失敗時にその記録を消去します。ワーカーが停止するとワーカーのグローバルは消える可能性があるため、起動をまたいで必要な状態は拡張機能の適切なストレージ領域に保持してください。

storage.session はブラウザ セッション内でのワーカーの再起動をまたいで存続しますが、ブラウザの再起動をまたぐ永続的なアカウント ストレージではありません。選択されたアカウントがない場合に拡張機能が何をするかを定義してください。

isProxy と challenger のチェックにより、無関係な Web サイトのチャレンジがこのアカウントを受け取るのを防ぎます。ブラウザがイベントをまったく配送しない場合、リスナーのクリーンアップだけではそれを生成できません。実際のリクエスト、権限、ブラウザの動作を個別に調べてください。

関連記事