Best Practices für die Verwendung von signInWithRedirect in Browsern, die den Speicherzugriff von Drittanbietern blockieren
In diesem Dokument werden die Best Practices für die Verwendung von Weiterleitungsanmeldungen in Browsern beschrieben, die Drittanbieter-Cookies blockieren. Sie müssen eine der hier aufgeführten Optionen nutzen, damit signInWithRedirect()
in Produktionsumgebungen in allen Browsern wie vorgesehen funktioniert.
Übersicht
Damit der signInWithRedirect()
-Vorgang für Sie und Ihre Nutzer reibungslos abläuft, verwendet das Firebase Authentication JavaScript SDK einen plattformübergreifenden Iframe, der eine Verbindung zur Firebase-Hostingdomain Ihrer App herstellt.
Dieser Mechanismus funktioniert jedoch nicht mit Browsern, die den Speicherzugriff von Drittanbietern blockieren.
Da es selten möglich ist, Nutzer zu bitten, Speicherpartitionierungsfunktionen im Browser zu deaktivieren, sollten Sie stattdessen eine der folgenden Einrichtungsoptionen auf Ihre App anwenden, je nach den Besonderheiten Ihres Anwendungsfalls.
- Wenn Sie Ihre App mit Firebase Hosting auf einer Subdomain von
firebaseapp.com
hosten, sind Sie von diesem Problem nicht betroffen und müssen nichts unternehmen. - Wenn Sie Ihre App mit Firebase Hosting auf einer benutzerdefinierten Domain oder einer Subdomain von
web.app
hosten, verwenden Sie Option 1: - Wenn Sie Ihre App bei einem anderen Dienst als Firebase hosten, verwenden Sie Option 2, Option 3, Option 4 oder Option 5.
Option 1: Firebase-Konfiguration so aktualisieren, dass Ihre benutzerdefinierte Domain als authDomain
Wenn Sie Ihre App mit Firebase Hosting und einer benutzerdefinierten Domain hosten, können Sie das Firebase SDK so konfigurieren, dass Ihre benutzerdefinierte Domain als authDomain
verwendet wird. So wird sichergestellt, dass Ihre App und der Authentifizierungs-Iframe dieselbe Domain verwenden, wodurch das Anmeldeproblem verhindert wird. Wenn Sie Firebase Hosting nicht verwenden, müssen Sie
eine andere Option.) Die benutzerdefinierte Domain muss in dem Projekt eingerichtet sein, das Sie für die Authentifizierung verwenden.
Um Ihre Firebase-Konfiguration so zu aktualisieren, dass Ihre benutzerdefinierte Domain als Authentifizierungsdomain verwendet wird, führen Sie Folgendes aus: Folgendes:
Konfigurieren Sie das Firebase JS SDK so, dass Ihre benutzerdefinierte Domain als
authDomain
verwendet wird:const firebaseConfig = { apiKey: "<api-key>", authDomain: "<the-domain-that-serves-your-app>", databaseURL: "<database-url>", projectId: "<project-id>", appId: "<app-id>" };
Füge das neue
authDomain
zur Liste der autorisierten OAuth-Anbieter hinzu. Weiterleitungs-URIs. Wie Sie dies tun, hängt vom Anbieter ab, aber im Allgemeinen können Sie sich an die eines Anbieters finden Sie Anweisungen (zum Beispiel Facebook-Anbieter). Der aktualisierte URI, der autorisiert werden soll, sieht so aus:https://<the-domain-that-serves-your-app>/__/auth/handler
. Das abschließende/__/auth/handler
ist wichtig.Wenn Sie einen SAML-Anbieter verwenden, fügen Sie dementsprechend die neue
authDomain
zum SAML Assertion Consumer Service (ACS)-URLAchten Sie darauf, dass sich Ihre
continue_uri
in der Liste der autorisierten Domains befindet.Stellen Sie bei Bedarf eine Neubereitstellung mit Firebase Hosting aus, um die aktuellste Firebase-Konfigurationsdatei abzurufen, die unter
/__/firebase/init.json
gehostet wird.
Option 2: Zu „signInWithPopup()“ wechseln
Verwenden Sie signInWithPopup()
anstelle von signInWithRedirect()
. Die
Der Rest des Codes Ihrer Anwendung bleibt gleich, aber das UserCredential-Objekt ist
unterschiedlich abgerufen werden.
Web version 9
// Before
// ==============
signInWithRedirect(auth, new GoogleAuthProvider());
// After the page redirects back
const userCred = await getRedirectResult(auth);
// After
// ==============
const userCred = await signInWithPopup(auth, new GoogleAuthProvider());
Webversion 8
// Before
// ==============
firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
// After the page redirects back
var userCred = await firebase.auth().getRedirectResult();
// After
// ==============
var userCred = await firebase.auth().signInWithPopup(
new firebase.auth.GoogleAuthProvider());
```
Eine Pop-up-Anmeldung ist nicht immer ideal. an das Gerät oder die Plattform und der Ablauf ist für mobile Nutzende weniger flüssig. Wenn die Verwendung von Pop-ups für Ihre App ein Problem darstellt, müssen Sie eine der anderen Optionen verwenden.
Option 3: Authentifizierungsanfragen über firebaseapp.com weiterleiten
Der signInWithRedirect
-Ablauf beginnt mit einer Weiterleitung von Ihrer App-Domain an den
Domain, die im Parameter authDomain
in der Firebase-Konfiguration angegeben ist
(standardmäßig authDomain
hostet die Anmeldehilfe
der den Nutzer an den Identitätsanbieter weiterleitet, der ihn anschließend wieder
mit der App-Domain verknüpfen.
Wenn der Authentifizierungsvorgang zu Ihrer App-Domain zurückkehrt, auf die Anmeldehilfedomain zugegriffen wird. Mit dieser Option und der folgenden Option (zum Self-Hosten des Codes) wird der speicherübergreifende Zugriff entfernt, der andernfalls von Browsern blockiert wird.
Richten Sie einen Reverse-Proxy auf Ihrem App-Server ein, damit GET-/POST-Anfragen an
https://<app domain>/__/auth/
anhttps://<project>.firebaseapp.com/__/auth/
weitergeleitet werden. Stellen Sie sicher, dass diese Weiterleitung für den Browser transparent ist. kann dies nicht über eine 302-Weiterleitung erfolgen.Wenn Sie nginx zum Bereitstellen Ihrer benutzerdefinierten Domain verwenden, sieht die Reverse-Proxy-Konfiguration so aus:
# reverse proxy for signin-helpers for popup/redirect sign in. location /__/auth { proxy_pass https://<project>.firebaseapp.com; }
Befolgen Sie die Schritte in Option 1 um die autorisierte
redirect_uri
, die ACS-URL und IhreauthDomain
zu aktualisieren. Nach der erneuten Bereitstellung sollte der ursprungsübergreifende Speicherzugriff nicht mehr erfolgen.
Option 4: Helper-Code für die Anmeldung selbst in Ihrer Domain hosten
Eine weitere Möglichkeit, den speicherübergreifenden Zugriff zu vermeiden, besteht darin, den Firebase-Hilfecode für die Anmeldung selbst zu hosten. Dieser Ansatz funktioniert jedoch nicht für Apple, Log-in oder SAML. Verwenden Sie diese Option nur, wenn die Reverse-Proxy-Einrichtung in Option 3 ist nicht umsetzbar.
So hostest du den Hilfscode:
Laden Sie die Dateien, die Sie hosten möchten, von
<project>.firebaseapp.com
herunter. Führen Sie dazu die folgenden Befehle aus:mkdir signin_helpers/ && cd signin_helpers wget https://<project>.firebaseapp.com/__/auth/handler wget https://<project>.firebaseapp.com/__/auth/handler.js wget https://<project>.firebaseapp.com/__/auth/experiments.js wget https://<project>.firebaseapp.com/__/auth/iframe wget https://<project>.firebaseapp.com/__/auth/iframe.js wget https://<project>.firebaseapp.com/__/firebase/init.json
Hosten Sie die oben genannten Dateien unter Ihrer App-Domain. Achten Sie darauf, dass Ihr Webserver kann auf
https://<app domain>/__/auth/<filename>
reagieren undhttps://<app domain>/__/firebase/init.json
.Hier ist eine Beispielserverimplementierung, die die Dateien herunterlädt und hostet. Wir empfehlen, die Dateien regelmäßig herunterzuladen und zu synchronisieren, damit die neuesten Fehlerkorrekturen und Funktionen übernommen werden.
Befolgen Sie die Schritte in Option 1 zum Aktualisieren autorisierter
redirect_uri
undauthDomain
. Nach der Neubereitstellung Ihrer App sollte der ursprungsübergreifende Speicherzugriff nicht mehr erfolgen.
Option 5: Anmeldung beim Anbieter unabhängig verarbeiten
Das Firebase Authentication SDK bietet die Methoden signInWithPopup()
und signInWithRedirect()
als praktische Methoden, um komplizierte Logik zu verpacken und die Einbindung eines anderen SDKs zu vermeiden. Sie können beide Methoden vollständig vermeiden, indem Sie sich unabhängig bei Ihrem Anbieter anmelden und dann mit signInWithCredential()
die Anmeldedaten des Anbieters gegen Anmeldedaten für die Firebase-Authentifizierung austauschen.
Sie können beispielsweise das Google Sign In SDK und den Beispielcode verwenden, um Anmeldedaten für ein Google-Konto abzurufen, und dann mit dem folgenden Code eine neue Google-Anmeldedateninstanz erstellen:
Web version 9
// `googleUser` from the onsuccess Google Sign In callback.
// googUser = gapi.auth2.getAuthInstance().currentUser.get();
const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
const result = await signInWithCredential(auth, credential);
Web version 8
// `googleUser` from the onsuccess Google Sign In callback.
const credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.getAuthResponse().id_token);
const result = await firebase.auth().signInWithCredential(credential);
Nachdem Sie signInWithCredential()
aufgerufen haben, funktioniert der Rest Ihrer App wie zuvor.
Eine Anleitung zum Abrufen von Apple-Anmeldedaten findest du hier.