Trocar de perfil de proxy deveria trocar a conta selecionada, não adicionar outro ouvinte onAuthRequired. Caso contrário, closures antigos podem continuar respondendo com a conta de uma seleção anterior.

Registre um único ouvinte nomeado no nível superior do service worker. Leia a conta atual quando um evento chegar:

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

Este trecho pressupõe que a extensão já armazena o proxy HTTP selecionado em selectedProxy, com uma porta numérica e a conta pretendida. O manifesto precisa de webRequest, webRequestAuthProvider, storage e as permissões de host necessárias. A própria seleção de proxy também precisa da permissão proxy.

O registro acontece de forma síncrona. O armazenamento é lido dentro do callback, depois que o Chrome tem um ouvinte instalado para entregar. Registrar só depois que uma promessa de armazenamento inicial for resolvida cria uma lacuna de despertar.

Adicione um limite de rejeição antes de publicar

O trecho mostra o registro e a seleção de conta. Adicione um registro de novas tentativas limitado para cada solicitação, para que uma senha rejeitada não seja enviada indefinidamente. Limpe esse registro ao concluir ou falhar. Globais do worker podem desaparecer quando o worker para, então mantenha o estado necessário entre despertares em uma área de armazenamento adequada da extensão.

storage.session sobrevive a reinícios do worker dentro da sessão do navegador; não é armazenamento permanente de conta entre reinícios do navegador. Defina o que a extensão faz quando nenhuma conta selecionada está disponível.

As verificações isProxy e challenger impedem que um desafio de um site não relacionado receba esta conta. Se o navegador nunca entregar o evento, a limpeza do ouvinte sozinha não pode produzi-lo: inspecione a solicitação real, as permissões e o comportamento do navegador separadamente.

Artigos relacionados