프록시 프로필을 전환할 때는 선택된 계정이 바뀌어야 하며, onAuthRequired 리스너를 하나 더 추가해서는 안 됩니다. 그렇지 않으면 이전 선택의 계정으로 이전 클로저가 계속 응답할 수 있습니다.

서비스 워커의 최상위 수준에 이름이 있는 리스너 하나를 등록하세요. 이벤트가 도착하면 현재 계정을 읽으세요:

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 검사는 관련 없는 웹사이트의 챌린지가 이 계정을 받지 못하게 막습니다. 브라우저가 이벤트를 전혀 전달하지 않는다면 리스너 정리만으로는 그것을 만들 수 없습니다. 실제 요청, 권한, 브라우저 동작을 각각 따로 점검하세요.

관련 글