Перемикання профілів проксі має змінювати вибраний обліковий запис, а не додавати ще один слухач 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 не дають виклику з незв'язаного сайту отримати цей обліковий запис. Якщо браузер ніколи не доставляє подію, саме лише очищення слухача не може її створити: перевіряйте фактичний запит, дозволи й поведінку браузера окремо.

Схожі статті