Cambiare profilo proxy dovrebbe cambiare l'account selezionato, non aggiungere un altro listener onAuthRequired. Altrimenti le vecchie closure possono continuare a rispondere con l'account di una selezione precedente.

Registrate un solo listener denominato al livello superiore del service worker. Leggete l'account corrente quando arriva un evento:

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'],
);

Questo frammento presuppone che l'estensione memorizzi già il proxy HTTP selezionato sotto selectedProxy, con una porta numerica e l'account previsto. Il manifest richiede webRequest, webRequestAuthProvider, storage e le autorizzazioni host necessarie. Anche la selezione del proxy richiede l'autorizzazione proxy.

La registrazione avviene in modo sincrono. La memoria viene letta nel callback, dopo che Chrome ha un listener installato a cui inviare. Registrare solo dopo la risoluzione di una promessa di archiviazione iniziale crea un vuoto di risveglio.

Aggiungete un limite di rifiuto prima della pubblicazione

Il frammento mostra la registrazione e la selezione dell'account. Aggiungete un record di nuovi tentativi limitato per ogni richiesta, così una password rifiutata non venga inviata all'infinito. Pulite quel record al completamento o in caso di errore. Le globali del worker possono sparire quando il worker si ferma, quindi conservate lo stato necessario tra i risvegli in un'area di archiviazione adeguata dell'estensione.

storage.session sopravvive ai riavvii del worker all'interno della sessione del browser; non è un'archiviazione permanente dell'account tra i riavvii del browser. Definite cosa fa l'estensione quando nessun account selezionato è disponibile.

I controlli isProxy e challenger impediscono a una sfida di un sito non correlato di ricevere questo account. Se il browser non invia mai l'evento, la sola pulizia del listener non può produrlo: esaminate separatamente la richiesta effettiva, le autorizzazioni e il comportamento del browser.

Articoli correlati