Задать вопрос
@vo0

Как правильно запрограммировать повторную аутентификация прокси в расширении Chrome?

Здравствуйте, я делаю расширение, которое позволяет изменять прокси-серверы с учетными данными аутентификации (пользователь/пароль) на лету.

Я использую 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)(и которую сейчас использую я) не делает того

Помогите пожалуйста разобраться. Что я делаю не так и что в моем коде приводит к тому, что при смене прокси, я попадаю в цикл неправильной аутентификации ?
  • Вопрос задан
  • 230 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
zkrvndm
@zkrvndm
Архитектор решений
Детские ошибки. А ты учел, что каждый раз, когда ты ставишь прокси, ты паралельно ставишь НОВЫЙ обработчик авторизации chrome.webRequest.onAuthRequired.addListener? При том СТАРЫЕ обработчики никуда не делись, они продолжают висеть и вызваться при каждой авторизации. Ведь ты не удосужился старые обработчики при помощи chrome.webRequest.onAuthRequired.removeListener удалить, а надо бы!

Тебе надо все переписать так, чтобы обработчик chrome.webRequest.onAuthRequired.addListener ставился только один раз за все время жизни фонового процесса background.js, либо удаляй сначала старые обработчики, прежде чем ставить новые.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
13 дек. 2024, в 17:55
10000 руб./за проект
13 дек. 2024, в 17:45
100000 руб./за проект