Зарегистрируйте один слушатель аутентификации прокси Chrome MV3 для переключения профиля
Зарегистрируйте слушатель аутентификации Manifest V3 синхронно и читайте текущую учётную запись прокси в обратном вызове события.
Переключение профилей прокси должно менять выбранную учётную запись, а не добавлять ещё один слушатель onAuthRequired. Иначе старые замыкания могут продолжать отвечать учётной записью из предыдущего выбора.
Зарегистрируйте один именованный слушатель на верхнем уровне service worker. Читайте текущую учётную запись при поступлении события:
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 есть установленный слушатель, которому можно доставлять. Регистрация только после разрешения начального обещания хранилища создаёт разрыв пробуждения.
Добавьте предел отказов перед выпуском
Фрагмент показывает регистрацию и выбор учётной записи. Добавьте ограниченную запись повторных попыток для каждого запроса, чтобы отклонённый пароль не отправлялся бесконечно. Очищайте эту запись при завершении или сбое. Глобальные переменные worker могут исчезнуть при остановке worker, поэтому храните состояние, нужное между пробуждениями, в подходящей области хранилища расширения.
storage.session переживает перезапуски worker в рамках сеанса браузера; это не постоянное хранилище учётной записи между перезапусками браузера. Определите, что делает расширение, когда выбранная учётная запись недоступна.
Проверки isProxy и challenger не дают запросу с несвязанного сайта получить эту учётную запись. Если браузер никогда не доставляет событие, одна очистка слушателя не может его создать: проверяйте фактический запрос, разрешения и поведение браузера по отдельности.