webRequest.onAuthRequired
Ausgelöst, wenn der Server einen Statuscode 401
oder 407
zusammen mit einem WWW-Authenticate
-Header unter Verwendung des Basic
-Schemas sendet (das heißt, wenn der Server den Client auffordert, Authentifizierungsdaten bereitzustellen, wie z.B. Benutzername und Passwort).
Der Listener kann auf eine der vier folgenden Arten reagieren:
- Keine Aktion durchführen
-
Der Listener kann nichts tun, sondern nur die Anfrage beobachten. Wenn dies geschieht, beeinflusst es die Handhabung der Anfrage nicht, und der Browser fordert den Benutzer auf, sich gegebenenfalls anzumelden.
- Die Anfrage abbrechen
-
Der Listener kann die Anfrage abbrechen. Wenn er dies tut, schlägt die Authentifizierung fehl und der Benutzer wird nicht zur Anmeldung aufgefordert. Erweiterungen können Anfragen wie folgt abbrechen:
- in
addListener
"blocking"
imextraInfoSpec
-Parameter übergeben - im Listener ein Objekt zurückgeben, dessen
cancel
-Eigenschaft auftrue
gesetzt ist
- in
- Anmeldedaten synchron bereitstellen
-
Wenn Anmeldedaten synchron verfügbar sind, kann die Erweiterung sie synchron bereitstellen. Wenn die Erweiterung dies tut, versucht der Browser sich mit den Anmeldedaten anzumelden. Der Listener kann Anmeldedaten synchron wie folgt bereitstellen:
- in
addListener
"blocking"
imextraInfoSpec
-Parameter übergeben - im Listener ein Objekt zurückgeben, dessen
authCredentials
-Eigenschaft auf die bereitzustellenden Anmeldedaten gesetzt ist
- in
- Anmeldedaten asynchron bereitstellen
-
Die Erweiterung benötigt möglicherweise, um Anmeldedaten asynchron abzurufen. Zum Beispiel muss die Erweiterung möglicherweise Anmeldedaten aus dem Speicher abrufen oder den Benutzer fragen. In diesem Fall kann der Listener Anmeldedaten asynchron wie folgt bereitstellen:
-
in
addListener
"asyncBlocking"
in Chrome und Firefox oder"blocking"
in Firefox imextraInfoSpec
-Parameter übergeben -
Wenn
"blocking"
bereitgestellt wird, kann die Erweiterung einwebRequest.BlockingResponse
-Objekt oder ein Promise, das zu einemwebRequest.BlockingResponse
-Objekt aufgelöst wird, zurückgeben -
Wenn
"asyncBlocking"
bereitgestellt wird, empfängt die Ereignis-Listener-Funktion eineasyncCallback
-Funktion als zweiten Parameter.asyncCallback
kann asynchron aufgerufen werden und nimmt einwebRequest.BlockingResponse
-Objekt als einzigen ParameterHinweis: Chrome unterstützt kein Promise als Rückgabewert (Chromium Issue 1510405). Für Alternativen siehe den Rückgabewert des
listener
.
-
Siehe Beispiele.
Wenn Ihre Erweiterung falsche Anmeldedaten bereitstellt, wird der Listener erneut aufgerufen. Aus diesem Grund sollten Sie darauf achten, nicht in einer Endlosschleife endlose falsche Anmeldedaten bereitzustellen.
Berechtigungen
In Firefox- und Chrome-Erweiterungen des Manifests V2 müssen Sie die API-Berechtigungen "webRequest"
und "webRequestBlocking"
zu Ihrer manifest.json
hinzufügen.
Bei Manifest V3-Erweiterungen unterstützt Chrome die Berechtigung "webRequestBlocking"
nicht mehr (außer bei von der Richtlinie installierten Erweiterungen). Stattdessen ermöglichen die Berechtigungen "webRequest"
und "webRequestAuthProvider"
Ihnen, Anmeldedaten asynchron bereitzustellen. Firefox unterstützt weiterhin "webRequestBlocking"
im Manifest V3 und bietet "webRequestAuthProvider"
für eine plattformübergreifende Kompatibilität an.
Proxy-Authentifizierung
Firefox löst generell keine webRequest
-Ereignisse für Systemanfragen aus, wie z.B. Browser- oder Erweiterungsaktualisierungen oder Suchmaschinenanfragen. Um eine reibungslose Proxy-Authentifizierung für Systemanfragen zu ermöglichen, unterstützt Firefox ab Version 57 eine Ausnahme.
Wenn eine Erweiterung die Berechtigungen "webRequest"
, "webRequestBlocking"
, "proxy"
und "<all_urls>"
hat, kann sie onAuthRequired
verwenden, um Anmeldedaten für die Proxy-Authentifizierung bereitzustellen (jedoch nicht für normale Web-Authentifizierungen). Der Listener kann Systemanfragen nicht abbrechen oder andere Änderungen an Systemanfragen vornehmen.
Syntax
browser.webRequest.onAuthRequired.addListener(
listener, // function
filter, // object
extraInfoSpec // optional array of strings
)
browser.webRequest.onAuthRequired.removeListener(listener)
browser.webRequest.onAuthRequired.hasListener(listener)
Ereignisse haben drei Funktionen:
addListener(listener, filter, extraInfoSpec)
-
Fügt einen Listener zu diesem Ereignis hinzu.
removeListener(listener)
-
Hört auf, diesem Ereignis zuzuhören. Das
listener
-Argument ist der zu entfernende Listener. hasListener(listener)
-
Überprüft, ob
listener
für dieses Ereignis registriert ist. Gibttrue
zurück, wenn es zuhört, andernfallsfalse
.
addListener Syntax
Parameter
listener
-
Die Funktion, die aufgerufen wird, wenn dieses Ereignis eintritt. Der Funktion werden diese Argumente übergeben:
details
-
object
. Details zur Anfrage. Siehe den Details-Abschnitt für weitere Informationen. asyncCallback
Optional-
Eine Funktion, die höchstens einmal aufgerufen wird, um das Anforderungsobjekt asynchron zu ändern. Dieser Parameter ist nur vorhanden, wenn der Ereignis-Listener mit
"asyncBlocking"
imextraInfoSpec
-Array registriert wurde.asyncCallback
ist undefiniert, wennextraInfoSpec
nicht bereitgestellt wird oder"blocking"
enthält.
Rückgabewert:
webRequest.BlockingResponse
oder einPromise
abhängig von den Einstellungen inextraInfoSpec
. filter
-
webRequest.RequestFilter
. Ein Filter, der die an diesen Listener gesendeten Ereignisse einschränkt. extraInfoSpec
Optional-
array
vonstring
. Zusätzliche Optionen für das Ereignis. Sie können folgende Werte übergeben:-
"blocking"
: Die Anfrage blockieren, sodass Sie die Anfrage abbrechen oder Authentifizierungsdaten bereitstellen können. Geben Sie einBlockingResponse
-Objekt zurück, dessencancel
- oderauthCredentials
-Eigenschaften festgelegt sind.- In Chrome muss der Ereignis-Listener synchron antworten.
- In Firefox kann der Ereignis-Listener synchron antworten oder ein Promise zurückgeben, das sich zu einem
BlockingResponse
-Objekt auflöst, um asynchron zu antworten.
-
"asyncBlocking"
: Die Anfrage asynchron bearbeiten. Der Rückgabewert des Ereignis-Listeners wird ignoriert. Um das Ereignis aufzulösen, übergeben Sie demasyncCallback
-Parameter einBlockingResponse
-Objekt.- Unterstützt ab Chrome 120 und Firefox 128.
- Nicht unterstützt in Safari.
-
Zusätzliche Objekte
Details
challenger
-
object
. Der Server, der die Authentifizierung anfordert. Dies ist ein Objekt mit den folgenden Eigenschaften: -
string
. Wenn die Anfrage von einem Tab stammt, der in einer kontextuellen Identität geöffnet ist, die ID des Cookie-Stores der kontextuellen Identität. Siehe Arbeiten mit kontextuellen Identitäten für weitere Informationen. frameId
-
integer
. Dies ist0
, wenn die Anfrage im Hauptframe stattfindet; ein positiver Wert ist die ID eines Unterframes, in dem die Anfrage stattfindet. Wenn das Dokument eines (Unter-)Frames geladen wird (type
istmain_frame
odersub_frame
), zeigtframeId
die ID dieses Frames an, nicht die ID des äußeren Frames. Frame-IDs sind innerhalb eines Tabs eindeutig. incognito
-
boolean
. Ob die Anfrage von einem privaten Browsertab stammt. isProxy
-
boolean
.true
fürProxy-Authenticate
,false
fürWWW-Authenticate
.Hinweis:
webRequest.onAuthRequired
wird nur für HTTP- und HTTPS/TLS-Proxyserver aufgerufen, die eine Authentifizierung erfordern, nicht für SOCKS-Proxyserver, die eine Authentifizierung erfordern. method
-
string
. Standard-HTTP-Methode (z. B."GET"
oder"POST"
). parentFrameId
-
integer
. ID des Frames, der den Frame enthält, der die Anfrage gesendet hat. Auf-1
setzen, wenn kein übergeordneter Frame existiert. proxyInfo
-
object
. Diese Eigenschaft ist nur vorhanden, wenn die Anfrage über einen Proxy geleitet wird. Sie enthält die folgenden Eigenschaften:host
-
string
. Der Hostname des Proxyservers. port
-
integer
. Die Portnummer des Proxyservers. type
-
string
. Der Typ des Proxyservers. Einer von:"http"
: HTTP-Proxy (oder SSL CONNECT für HTTPS)"https"
: HTTP-Proxying über TLS-Verbindung zum Proxy"socks"
: SOCKS v5 Proxy"socks4"
: SOCKS v4 Proxy"direct"
: kein Proxy"unknown"
: unbekannter Proxy
username
-
string
. Benutzername für den Proxydienst. proxyDNS
-
boolean
. True, wenn der Proxy die DNS-Auflösung basierend auf dem angegebenen Hostnamen durchführt, was bedeutet, dass der Client keine eigene DNS-Abfrage durchführen sollte. failoverTimeout
-
integer
. Failover-Timeout in Sekunden. Wenn die Verbindung nach dieser Anzahl von Sekunden fehlschlägt, wird der nächste Proxyserver im Array, das von FindProxyForURL() zurückgegeben wird, verwendet.
realm
Optional-
string
. Das vom Server bereitgestellte Authentifizierungs-Realm, falls vorhanden. requestId
-
string
. Die ID der Anfrage. Anfrage-IDs sind innerhalb einer Browsersession eindeutig, sodass Sie verschiedene Ereignisse mit derselben Anfrage in Verbindung bringen können. responseHeaders
Optional-
webRequest.HttpHeaders
. Die HTTP-Response-Header, die mit dieser Antwort empfangen wurden. scheme
-
string
. Das Authentifizierungsschema:"basic"
oder"digest"
. statusCode
-
integer
. Der vom Server zurückgegebene Standard-HTTP-Statuscode. statusLine
-
string
. HTTP-Statuszeile der Antwort, die'HTTP/0.9 200 OK'
-Zeichenfolge für HTTP/0.9-Antworten (d.h. Antworten, die keine Statuszeile enthalten) oder eine leere Zeichenfolge, wenn keine Header vorhanden sind. tabId
-
integer
. Die ID des Tabs, in dem die Anfrage stattfindet. Auf-1
setzen, wenn die Anfrage nicht mit einem Tab verknüpft ist. thirdParty
-
boolean
. Gibt an, ob die Anfrage und ihre Inhaltsfensterhierarchie von Drittanbietern stammen. timeStamp
-
number
. Die Zeit, zu der dieses Ereignis ausgelöst wurde, in Millisekunden seit der Epoche. type
-
webRequest.ResourceType
. Der Typ der angeforderten Ressource: zum Beispiel"image"
,"script"
oder"stylesheet"
. url
-
string
. Ziel der Anfrage. urlClassification
-
object
. Die Art des Trackings, die mit der Anfrage verbunden ist, falls diese von Firefox Tracking Protection klassifiziert wird. Dies ist ein Objekt mit den folgenden Eigenschaften:firstParty
-
array
vonstring
. Klassifikationsflags für die First Party der Anfrage. thirdParty
-
array
vonstring
. Klassifikationsflags für die Anfrage oder die Third Parties ihrer Fensterhierarchie.
Die Klassifikationsflags umfassen:
fingerprinting
undfingerprinting_content
: gibt an, dass die Anfrage an Fingerprinting beteiligt ist ("ein Ursprung, der zum Fingerprinting gefunden wurde").fingerprinting
weist darauf hin, dass die Domain in der Fingerprinting- und Tracking-Kategorie ist. Beispiele für diese Art von Domains sind Werbetreibende, die ein Profil mit dem besuchenden Nutzer verknüpfen möchten.fingerprinting_content
zeigt an, dass die Domain in der Fingerprinting-Kategorie, aber nicht in der Tracking-Kategorie ist. Beispiele für diese Art von Domains sind Zahlungsanbieter, die Fingerprinting-Techniken verwenden, um den besuchenden Benutzer zur Betrugsbekämpfung zu identifizieren.
cryptomining
undcryptomining_content
: ähnlich wie die Fingerprinting-Kategorie, jedoch für Kryptomining-Ressourcen.tracking
,tracking_ad
,tracking_analytics
,tracking_social
undtracking_content
: gibt an, dass die Anfrage am Tracking beteiligt ist.tracking
ist eine generische Tracking-Anfrage. Die Suffixead
,analytics
,social
undcontent
identifizieren die Art des Trackers.emailtracking
undemailtracking_content
: gibt an, dass die Anfrage am Tracking von E-Mails beteiligt ist.any_basic_tracking
: ein Metaflag, das Tracking- und Fingerprinting-Flags kombiniert, mit Ausnahme vontracking_content
undfingerprinting_content
.any_strict_tracking
: ein Metaflag, das alle Tracking- und Fingerprinting-Flags kombiniert.any_social_tracking
: ein Metaflag, das alle sozialen Tracking-Flags kombiniert.
Weitere Informationen zu Tracker-Typen finden Sie auf der disconnect.me Website. Das
content
-Suffix kennzeichnet Tracker, die Inhalte tracken und bereitstellen. Das Blockieren schützt Benutzer, kann jedoch dazu führen, dass Websites brechen oder Elemente nicht angezeigt werden.
Beispiele
Dieser Code beobachtet Authentifizierungsanfragen für die Ziel-URL:
const target = "https://intranet.company.com/";
function observe(requestDetails) {
console.log(`observing: ${requestDetails.requestId}`);
}
browser.webRequest.onAuthRequired.addListener(observe, { urls: [target] });
Dieser Code bricht Authentifizierungsanfragen für die Ziel-URL ab:
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",
]);
Dieser Code stellt synchron Anmeldedaten bereit. Er verfolgt ausstehende Anfragen, um sicherzustellen, dass er nicht wiederholt versucht, falsche Anmeldedaten einzureichen:
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] });
Dieser Code stellt Anmeldedaten asynchron bereit und ruft sie aus dem Speicher ab. Er verfolgt auch ausstehende Anfragen, um sicherzustellen, dass er nicht wiederholt versucht, falsche Anmeldedaten einzureichen:
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 };
}
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] });
Beispielerweiterungen
Browser-Kompatibilität
Hinweis:
Diese API basiert auf Chromiums chrome.webRequest
API. Diese Dokumentation ist abgeleitet von web_request.json
im Chromium-Code.