การสลับโปรไฟล์พร็อกซีควรเปลี่ยนบัญชีที่เลือก ไม่ใช่เพิ่มตัวรับฟัง onAuthRequired อีกตัว มิฉะนั้น closures เก่าอาจตอบกลับด้วยบัญชีจากการเลือกครั้งก่อนต่อไป

ลงทะเบียนตัวรับฟังที่มีชื่อหนึ่งตัวที่ระดับบนสุดของ 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 มีตัวรับฟังที่ติดตั้งไว้ให้ส่งถึง การลงทะเบียนหลังสัญญาณ storage เริ่มต้นได้รับการแก้ไขเท่านั้นจะสร้างช่องว่างการตื่น

เพิ่มขีดจำกัดการปฏิเสธก่อนเผยแพร่

ส่วนย่อยแสดงการลงทะเบียนและการเลือกบัญชี เพิ่มบันทึกการลองใหม่แบบจำกัดสำหรับแต่ละคำขอ เพื่อไม่ให้รหัสผ่านที่ถูกปฏิเสธถูกส่งซ้ำไม่สิ้นสุด ล้างบันทึกนั้นเมื่อเสร็จหรือล้มเหลว ตัวแปรโกลบอลของ worker อาจหายไปเมื่อ worker หยุด ดังนั้นเก็บสถานะที่จำเป็นระหว่างการตื่นไว้ในพื้นที่เก็บข้อมูลของส่วนขยายที่เหมาะสม

storage.session อยู่รอดจากการรีสตาร์ต worker ภายในเซสชันเบราว์เซอร์ มันไม่ใช่ที่เก็บบัญชีถาวรระหว่างการรีสตาร์ตเบราว์เซอร์ กำหนดสิ่งที่ส่วนขยายทำเมื่อไม่มีบัญชีที่เลือกไว้

การตรวจสอบ isProxy และ challenger ป้องกันไม่ให้ความท้าทายจากเว็บไซต์ที่ไม่เกี่ยวข้องได้รับบัญชีนี้ หากเบราว์เซอร์ไม่ส่งเหตุการณ์เลย การล้างตัวรับฟังเพียงอย่างเดียวไม่สามารถสร้างมันได้ ตรวจสอบคำขอจริง สิทธิ์ และพฤติกรรมของเบราว์เซอร์แยกกัน

บทความที่เกี่ยวข้อง