Избегайте всплывающих окон аутентификации HTTP в расширении Chrome (дайджест)

В настоящее время я разрабатываю расширение для Chrome, мне нужно получить доступ к некоторым защищенным ресурсам http-auth (webdav). HTTP-аутентификация использует (в лучшем случае) дайджест-аутентификацию.

Я могу выполнить аутентификацию непосредственно в запросе ajax, используя https://login:[email protected]/path/to/ressource.

Проблема в том, что если логин/пароль неверный, я не могу просто получить статус 401 (неавторизованный), Chrome выводит обычный диалог аутентификации. Чего я не хочу, потому что это сбивает с толку пользователя, и я не могу сохранить учетные данные отсюда.

РЕДАКТИРОВАТЬ: Еще один вариант использования, с которым я столкнулся: я хочу проверить, защищен ли ресурс паролем, не пытаясь предоставить учетные данные для фактического доступа к нему.

Любые идеи о том, как поймать 401, не открывая окно аутентификации Chrome?


person Jocelyn delalande    schedule 10.10.2010    source источник


Ответы (3)


Команды Google Chrome внедрили событие onAuthRequired в Google Chrome 22, поэтому теперь можно определить, когда требуется базовая аутентификация HTTP.

На самом деле я написал расширение, которое автоматически отправляет учетные данные HTTP Basic Authentication с помощью события onAuthRequired.

Он доступен бесплатно в официальном интернет-магазине Google Chrome: https://chrome.google.com/webstore/detail/basic-authentication-auto/dgpgkkfheijbcgjklcbnokoleebmeokn

Пример использования события onAuthRequired:

sendCredentials = function(status)
{   
    console.log(status);
    return {username: "foo", password: "bar"};
}

chrome.webRequest.onAuthRequired.addListener(sendCredentials, {urls: ["<all_urls>"]}, ["blocking"]);

Вам нужно добавить правильные разрешения в файл манифеста, чтобы использовать onAuthRequired.

"permissions": [ "http://*/*", "https://*/*", "webRequest", "webRequestBlocking", "tabs" ],

Загрузите расширения и проверьте исходный код для лучшего подхода.

Это должно работать, даже если запрос был инициирован с другого расширения.

person Juan Lago    schedule 11.01.2014
comment
Вроде красиво, Спасибо! Пожалуйста, кто-нибудь, чтобы подтвердить/подтвердить это? (Мой разум сейчас далек от этих забот, поэтому я не буду сам). - person Jocelyn delalande; 11.01.2014
comment
Привет, я хотел сообщить вам, что этот код необходимо обновить. Вам нужно вернуть такой объект: return {authCredentials:{имя пользователя: 'XXX', пароль: 'XXX'}} По крайней мере, это сработало для меня. - person Goran Usljebrka; 25.02.2016

Это действительно похоже на недостаток поведения Chrome, другие люди хотят видеть что-то, как подчеркнул mozBakgroundRequest Крис, уже есть отчет об ошибке.

Есть (хакерские) обходные пути, предложенные некоторыми разработчиками в багтрекере:

  • использовать веб-воркер и тайм-аут для выполнения запроса
  • сделать то же самое с фоновой страницей

В обоих случаях преимущество заключается в том, что он не выводит окно аутентификации... Но вы никогда не узнаете, действительно ли это тайм-аут сервера или ошибка 401. (Я не проверял эти обходные пути).

person Jocelyn delalande    schedule 13.10.2010

Я думаю, что это невозможно. Если вы используете http-клиент браузера, он запросит у пользователя учетные данные на 401.

РЕДАКТИРОВАТЬ: в стране мозиллы https://developer.mozilla.org/en/XMLHttpRequest проверить "mozBackgroundRequest".

person Chris    schedule 12.10.2010
comment
Боюсь так :-x. Жаль, что нет способа гладко получить доступ к webdav из расширения. - person Jocelyn delalande; 13.10.2010