webRequest.onAuthRequired
Вызывается, когда сервер отправляет код состояния 401 или 407 (то есть, когда сервер запрашивает у клиента предоставление учетных данных для аутентификации, таких как имя пользователя и пароль).
Обработчик может ответить четырьмя различными способами:
- Бездействие
-
Обработчик может ничего не делать, просто наблюдая за запросом. В этом случае это не повлияет на обработку запроса, и браузер, вероятно, попросит пользователя войти в систему.
- Отмена запроса
-
Обработчик может отменить запрос. В этом случае аутентификация завершится неудачей, и пользователя не попросят войти в систему. Расширения могут отменять запросы следующим образом:
- в addListener, передайте
"blocking"в параметреextraInfoSpec - в самом обработчике верните объект со свойством
cancel, установленным в значениеtrue
- в addListener, передайте
- Предоставление учетных данных синхронно
-
Если учетные данные доступны синхронно, расширение может предоставить их синхронно. В этом случае браузер попытается войти в систему с предоставленными учетными данными. Обработчик может предоставить учетные данные синхронно следующим образом:
- в addListener, передайте
"blocking"в параметреextraInfoSpec - в обработчике верните объект со свойством
authCredentials, установленным в учетные данные для предоставления
- в addListener, передайте
- Предоставление учетных данных асинхронно
-
Расширение может потребоваться получить учетные данные асинхронно. Например, расширение может потребоваться получить учетные данные из хранилища или запросить их у пользователя. В этом случае обработчик может предоставить учетные данные асинхронно следующим образом:
- в addListener, передайте
"blocking"в параметреextraInfoSpec - в обработчике верните
Promise, который разрешается объектом, содержащим свойствоauthCredentials, установленное в учетные данные для предоставления
- в addListener, передайте
См. Примеры.
Если вы используете "blocking", вам необходимо иметь разрешение "webRequestBlocking" API в вашем manifest.json.
Если ваше расширение предоставляет неверные учетные данные, обработчик будет вызван снова. По этой причине, следите за тем, чтобы не попасть в бесконечный цикл, многократно предоставляя неверные учетные данные.
Авторизация прокси-сервера
В общем случае Firefox не вызывает события webRequest для системных запросов, таких как обновления браузера или расширений, или запросы поисковых систем. Чтобы обеспечить бесперебойную работу авторизации прокси-сервера для системных запросов, с версии 57 Firefox реализует исключение из этого правила.
Если у расширения есть разрешения "webRequest", "webRequestBlocking", "proxy", и "<all_urls>", оно сможет использовать onAuthRequired для предоставления учетных данных для авторизации прокси-сервера (но не для обычной веб-авторизации). Обработчик не сможет отменять системные запросы или вносить какие-либо другие изменения в системные запросы.
Синтаксис
browser.webRequest.onAuthRequired.addListener( listener, // function filter, // object extraInfoSpec // optional array of strings ) browser.webRequest.onAuthRequired.removeListener(listener) browser.webRequest.onAuthRequired.hasListener(listener)
События имеют три функции:
addListener(callback, filter, extraInfoSpec)-
Добавляет обработчик на это событие.
removeListener(listener)-
Остановить прослушивание этого события. Аргумент
listener— это обработчик для удаления. hasListener(listener)-
Проверка, зарегистрирован ли
listenerдля этого события. Возвращаетtrueесли прослушивание активное,falseв противном случае.
Синтаксис addListener
Параметры
callback-
Функция, которая будет вызываться при возникновении этого события. Функция получит следующие аргументы:
details-
object. Сведения о запросе. Смотрите раздел details для получения дополнительной информации.
Возвращает:
webRequest.BlockingResponseилиPromise.- Для обработки запроса синхронно, включите
"blocking"в параметрextraInfoSpecи верните объектBlockingResponse, с установленным свойствомcancelилиauthCredentials - Для обработки запроса асинхронно, включите
"blocking"в параметрextraInfoSpecи вернитеPromise, который разрешается объектомBlockingResponse, с установленным свойствомcancelилиauthCredentials
filter-
webRequest.RequestFilter. Фильтр, ограничивающий события, которые будут отправлены в этот обработчик. -
extraInfoSpecНеобязательно -
arraystring. Дополнительные параметры для события. Вы можете передать следующие значения:-
"blocking": заблокировать запрос, чтобы вы могли отменить запрос или предоставить учетные данные для аутентификации -
"responseHeaders": включитьresponseHeadersв объектdetailsпереданный обработчику
-
Дополнительные объекты
подробности
challenger-
object. Сервер, запрашивающий аутентификацию. Это объект со следующими свойствами:host-
string. Имя хоста сервера. port-
integer. Номер порта сервера.
-
string. Если запрос поступает из вкладки, открытой в контекстной идентичности, идентификатор хранилища cookie контекстной идентичности. frameId-
integer. Это0если запрос происходит в основном фрейме; положительное значение — это идентификатор подфрейма, в котором происходит запрос. Если документ (под)фрейма загружен (type—main_frameилиsub_frame),frameIdуказывает идентификатор этого фрейма, а не идентификатор внешнего фрейма. Идентификаторы фреймов уникальны в пределах вкладки. incognito-
boolean. Является ли запрос из окна приватного просмотра. isProxy-
boolean.trueдляProxy-Authenticate,falseдляWWW-Authenticate.Примечание:
webRequest.onAuthRequiredвызывается только для HTTP и HTTPS/SSL прокси-серверов, требующих аутентификации, и не для прокси-серверов SOCKS, требующих аутентификации. method-
string. Стандартный HTTP-метод (например,"GET"или"POST"). parentFrameId-
integer. Идентификатор фрейма, содержащего фрейм, который отправил запрос. Установлено в-1если родительский фрейм отсутствует. proxyInfo-
object. Это свойство присутствует только в случае проксирования запроса. Оно содержит следующие свойства:host-
string. Имя хоста прокси-сервера. port-
integer. Номер порта прокси-сервера. type-
string. Тип прокси-сервера. Один из:-
"http": HTTP-прокси (или SSL CONNECT для HTTPS) -
"https": HTTP-проксирование через TLS-соединение с прокси -
"socks": SOCKS v5 прокси -
"socks4": SOCKS v4 прокси -
"direct": без прокси -
"unknown": неизвестный прокси
-
username-
string. Имя пользователя для службы прокси. proxyDNS-
boolean. Истинно, если прокси выполнит разрешение доменных имен на основе предоставленного имени хоста, что означает, что клиент не должен выполнять собственный поиск DNS. failoverTimeout-
integer. Время ожидания переключения в секундах. Если соединение не удается подключиться к прокси-серверу после этого количества секунд, будет использован следующий прокси-сервер из массива, возвращаемого функцией FindProxyForURL().
-
realmОпционально -
string. Предоставленный сервером аутентификационный realm, если он есть. requestId-
string. Идентификатор запроса. Идентификаторы запросов уникальны в сессии браузера, поэтому их можно использовать для связывания различных событий, связанных с одним запросом. -
responseHeadersОпционально -
webRequest.HttpHeaders. HTTP-заголовки ответа, полученные вместе с этим ответом. scheme-
string. Схема аутентификации:"basic"или"digest". statusCode-
integer. Стандартный HTTP-код состояния, возвращаемый сервером. statusLine-
string. Строка состояния HTTP ответа или строка'HTTP/0.9 200 OK'для ответов HTTP/0.9 (т.е. ответов, не содержащих строки состояния) или пустая строка, если заголовков нет. tabId-
integer. Идентификатор вкладки, в которой происходит запрос. Установлено в-1если запрос не связан с вкладкой. thirdParty-
boolean. Указывает, является ли запрос и его иерархия окна сторонними. timeStamp-
number. Время срабатывания этого события в миллисекундах с момента эпохи. type-
webRequest.ResourceType. Тип запрашиваемого ресурса: например,"image","script","stylesheet". url-
string. Цель запроса. urlClassification-
object. Тип отслеживания, связанный с запросом, если запрос классифицирован функцией Защитой от отслеживания Firefox. Это объект со следующими свойствами:firstParty-
arraystrings. Флаги классификации для первой стороны запроса. thirdParty-
arraystrings. Флаги классификации для запроса или сторонних участников иерархии его окна.
Флаги классификации включают:
-
fingerprintingиfingerprinting_content: указывает, что запрос участвует в определении личности.fingerprinting_contentуказывает, что запрос загружается из источника, который, как было установлено, определяет личность, но не считается участником отслеживания, например, поставщик платежных услуг. -
cryptominingиcryptomining_content: аналогично категории определения личности, но для ресурсов майнинга криптовалюты. -
tracking,tracking_ad,tracking_analytics,tracking_social, иtracking_content: указывает, что запрос участвует в отслеживании.tracking— любой общий запрос отслеживания, суффиксыad,analytics,social, иcontentидентифицируют тип отслеживателя. -
any_basic_tracking: метафлаг, объединяющий все флаги отслеживания и определения личности, за исключениемtracking_contentиfingerprinting_content. -
any_strict_tracking: метафлаг, объединяющий все флаги отслеживания и определения личности, включаяtracking_contentиfingerprinting_content. -
any_social_tracking: метафлаг, объединяющий все флаги социального отслеживания.
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | |
onAuthRequired |
Да | 14 | 54Для асинхронной обработки запроса верните Promise из обработчика. |
? | Да | 14extraInfoSpec параметры не поддерживаются. |
? | ? | 54Для асинхронной обработки запроса верните Promise из обработчика. |
? | Нет | ? |
asyncBlocking |
Да | 14 | Нет | ? | Да | Нет | ? | ? | Нет | ? | Нет | ? |
Примеры
Этот код просто наблюдает за запросами на аутентификацию для целевого URL:
const target = "https://intranet.company.com/"; function observe(requestDetails) { console.log(`observing: ${requestDetails.requestId}`); } browser.webRequest.onAuthRequired.addListener( observe, {urls: [target]} );
Этот код отменяет запросы на аутентификацию для целевого URL:
const target = "https://intranet.company.com/"; function cancel(requestDetails) { console.log(`canceling: ${requestDetails.requestId}`); return {cancel: true}; } browser.webRequest.onAuthRequired.addListener( cancel, {urls: [target]}, ["blocking"] );
Этот код предоставляет учетные данные синхронно. Он должен отслеживать ожидающие запросы, чтобы убедиться, что он не пытается повторно отправлять плохие учетные данные:
const target = "https://intranet.company.com/"; const myCredentials = { username: "me@company.com", password: "zDR$ERHGDFy" } const pendingRequests = []; // A request has completed. // We can stop worrying about it. function completed(requestDetails) { console.log(`completed: ${requestDetails.requestId}`); let index = pendingRequests.indexOf(requestDetails.requestId); if (index > -1) { pendingRequests.splice(index, 1); } } function provideCredentialsSync(requestDetails) { // If we have seen this request before, then // assume our credentials were bad, and give up. if (pendingRequests.includes(requestDetails.requestId)) { console.log(`bad credentials for: ${requestDetails.requestId}`); return {cancel:true}; } pendingRequests.push(requestDetails.requestId); console.log(`providing credentials for: ${requestDetails.requestId}`); return {authCredentials: myCredentials}; } browser.webRequest.onAuthRequired.addListener( provideCredentialsSync, {urls: [target]}, ["blocking"] ); browser.webRequest.onCompleted.addListener( completed, {urls: [target]} ); browser.webRequest.onErrorOccurred.addListener( completed, {urls: [target]} );
Этот код предоставляет учетные данные асинхронно, извлекая их из хранилища. Он также должен отслеживать ожидающие запросы, чтобы убедиться, что он не пытается повторно отправлять плохие учетные данные:
const target = "https://httpbin.org/basic-auth/*"; const pendingRequests = []; /* * A request has completed. We can stop worrying about it. */ function completed(requestDetails) { console.log(`completed: ${requestDetails.requestId}`); let index = pendingRequests.indexOf(requestDetails.requestId); if (index > -1) { pendingRequests.splice(index, 1); } } function provideCredentialsAsync(requestDetails) { // If we have seen this request before, // then assume our credentials were bad, // and give up. if (pendingRequests.includes(requestDetails.requestId)) { console.log(`bad credentials for: ${requestDetails.requestId}`); return {cancel: true}; } else { pendingRequests.push(requestDetails.requestId); console.log(`providing credentials for: ${requestDetails.requestId}`); // we can return a promise that will be resolved // with the stored credentials return browser.storage.local.get(null); } } browser.webRequest.onAuthRequired.addListener( provideCredentialsAsync, {urls: [target]}, ["blocking"] ); browser.webRequest.onCompleted.addListener( completed, {urls: [target]} ); browser.webRequest.onErrorOccurred.addListener( completed, {urls: [target]} );
Примеры расширений
Примечание: Этот API основан на API chrome.webRequest Chromium. Данное описание взято из web_request.json кода Chromium.
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onAuthRequired