Здравствуйте, я делаю расширение, которое позволяет изменять прокси-серверы с учетными данными аутентификации (пользователь/пароль) на лету.
Я использую
chrome.proxy.settings
для изменения текущего прокси и слушаю событие
webRequest.onAuthRequired
и когда сервер запрашивает аутентификацию, передаю имя пользователя и пароль которые получаю при разборе url прокси.
async function setProxy(proxy) {
proxy = new URL(proxy)
var config = {
mode: 'fixed_servers',
rules: {
singleProxy: {
scheme: "http",
host: proxy.hostname,
port: parseInt(proxy.port),
},
bypassList: ["localhost"],
}
}
chrome.proxy.settings.set(
{
value: config,
scope: "regular",
},
function () { }
)
var myCredetails = { username: proxy.username, password: proxy.password }
chrome.webRequest.onAuthRequired.addListener(
function (details, callbackFn) {
console.log(myCredetails)
console.log("onAuthRequired!", details, callbackFn);
callbackFn({
authCredentials: myCredetails
});
},
{ urls: ["<all_urls>"] },
['asyncBlocking']
);
}
Моя проблема заключается в том, что при запуске расширения, у браузера получается правильно авторизироаться только к первому переданному в эту функцию прокси.
Я логирую передаваемые учетные данные и запуск обработчика, и в консоли первая успешная авторизация выглядит так:
background.js[52] 11:11:11 - {username: '11111', password: '11111'}
background.js[52] 11:11:11 - onAuthRequired! {challenger: {…}, documentLifecycle: 'active', frameId: 0, frameType: 'outermost_frame', initiator: 'chrome-extension://jkdijjjobdgdconmccahccapedgncolo', …} ƒ (response) {
webRequestInternal.eventHandled(
eventName, subEventName, requestId, webViewInstanceId, response);
}
Дальше, по прошествию заданного времени, в функцию
setProxy
передается url другого прокси. Прокси изменяется в настройках, срабатывает обработчик события
onAuthRequired
, но авторизация на этот раз происходит не правильно, и зацикливается. В логах это выглядит так:
background.js[52] 11:13:00 - {username: '11111', password: '11111'}
background.js[52] 11:13:00 - onAuthRequired! {challenger: {…}, documentLifecycle: 'active', frameId: 0, frameType: 'outermost_frame', initiator: 'chrome-extension://jkdijjjobdgdconmccahccapedgncolo', …} ƒ (response) {
webRequestInternal.eventHandled(
eventName, subEventName, requestId, webViewInstanceId, response);
}
background.js[52] 11:13:01 - {username: '22222', password: '22222'}
background.js[52] 11:13:01 - onAuthRequired! {challenger: {…}, documentLifecycle: 'active', frameId: 0, frameType: 'outermost_frame', initiator: 'chrome-extension://jkdijjjobdgdconmccahccapedgncolo', …} ƒ (response) {
webRequestInternal.eventHandled(
eventName, subEventName, requestId, webViewInstanceId, response);
}
background.js[52] 11:13:02 - {username: '11111', password: '11111'}
background.js[52] 11:13:02 - onAuthRequired! {challenger: {…}, documentLifecycle: 'active', frameId: 0, frameType: 'outermost_frame', initiator: 'chrome-extension://jkdijjjobdgdconmccahccapedgncolo', …} ƒ (response) {
webRequestInternal.eventHandled(
eventName, subEventName, requestId, webViewInstanceId, response);
}
Как я вижу в логах, при смене прокси, для авторизации начинают передаваться логин и пароль полученные не только из того прокси который был передан сейчас, но и из того который был передан до этого. Т.е. начинают чередоваться логин/пароль из текущего и ранее переданных в
onAuthRequired
данных.
Исходя из этого у меня есть стойкое ощущение, что что-то у меня не так сделано в части передачи логин/пароль в обработчик
onAuthRequired
, что данные переданные в него где-то кешируются и при повторном срабатывании берутся не только из того что я передаю в данный момент но и откуда-то еще. И из за этого происходит попадание в цикл неправильной аутентификации.
Где-то на просторах я читал что нужно для получения логина/пароля перед передачей в обработчик
onAuthRequired
обязательно использовать
Promise
, который является правильным способом аутентификации, поскольку код перестает выполняться до тех пор, пока обещание не будет выполнено. Использование функции обратного вызова (которую использует API Chrome)(и которую сейчас использую я) не делает того
Помогите пожалуйста разобраться. Что я делаю не так и что в моем коде приводит к тому, что при смене прокси, я попадаю в цикл неправильной аутентификации ?