Sie können Ihren Nutzern erlauben, sich mit ihren Google-Konten bei Firebase zu authentifizieren. Sie können entweder das Firebase SDK verwenden, um den Google-Anmeldevorgang auszuführen, oder den Anmeldevorgang manuell mit der „Über Google anmelden“-Bibliothek ausführen und das resultierende ID-Token an Firebase übergeben.
Hinweis
- Fügen Sie Ihrem JavaScript-Projekt Firebase hinzu.
- Aktivieren Sie Google als Anmeldemethode in der Firebase Console:
- Öffnen Sie in der Firebase Console den Bereich Auth.
- Aktivieren Sie auf dem Tab Anmeldemethode die Anmeldemethode Google und klicken Sie auf Speichern.
Anmeldevorgang mit dem Firebase SDK abwickeln
Wenn Sie eine Webanwendung entwickeln, ist das Firebase JavaScript SDK die einfachste Möglichkeit, Ihre Nutzer mit ihren Google-Konten bei Firebase zu authentifizieren. Wenn Sie einen Nutzer in Node.js oder einer anderen nicht browserbasierten Umgebung authentifizieren möchten, müssen Sie den Anmeldevorgang manuell abwickeln.
So verarbeiten Sie den Anmeldevorgang mit dem Firebase JavaScript SDK:
- Erstellen Sie eine Instanz des Google-Anbieter-Objekts:
import { GoogleAuthProvider } from "firebase/auth";
const provider = new GoogleAuthProvider();var provider = new firebase.auth.GoogleAuthProvider();
- Optional: Geben Sie zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten. Wenn Sie einen Umfang hinzufügen möchten, rufen Sie
addScope
auf. Beispiel:provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
- Optional: Wenn du den OAuth-Ablauf des Anbieters in der bevorzugten Sprache des Nutzers lokalisieren möchtest, ohne die entsprechenden benutzerdefinierten OAuth-Parameter explizit zu übergeben, aktualisiere den Sprachcode in der Auth-Instanz, bevor du den OAuth-Ablauf startest. Beispiel:
import { getAuth } from "firebase/auth";
const auth = getAuth();
auth.languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// auth.useDeviceLanguage();firebase.auth().languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// firebase.auth().useDeviceLanguage(); - Optional: Geben Sie zusätzliche benutzerdefinierte OAuth-Anbieterparameter an, die mit der OAuth-Anfrage gesendet werden sollen. Wenn Sie einen benutzerdefinierten Parameter hinzufügen möchten, rufen Sie
setCustomParameters
beim initialisierten Anbieter mit einem Objekt auf, das den in der OAuth-Anbieterdokumentation angegebenen Schlüssel und den entsprechenden Wert enthält. Beispiel:provider.setCustomParameters({
'login_hint': 'user@example.com'
});provider.setCustomParameters({
'login_hint': 'user@example.com'
}); - Authentifizieren Sie sich mit Firebase über das Google-Anbieterobjekt. Sie können Nutzer auffordern, sich mit ihren Google-Konten anzumelden, indem Sie ein Pop-up-Fenster öffnen oder sie zur Anmeldeseite weiterleiten. Die Weiterleitungsmethode wird auf Mobilgeräten bevorzugt.
- Wenn Sie sich über ein Pop-up-Fenster anmelden möchten, drücken Sie
signInWithPopup
:import { getAuth, signInWithPopup, GoogleAuthProvider } from "firebase/auth";
const auth = getAuth();
signInWithPopup(auth, provider)
.then((result) => {
// This gives you a Google Access Token. You can use it to access the Google API.
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
// The signed-in user info.
const user = result.user;
// IdP data available using getAdditionalUserInfo(result)
// ...
}).catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.customData.email;
// The AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});firebase.auth()
.signInWithPopup(provider)
.then((result) => {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// The signed-in user info.
var user = result.user;
// IdP data available in result.additionalUserInfo.profile.
// ...
}).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});Hier können Sie auch Fehler abfangen und behandeln. Eine Liste der Fehlercodes findest du in den Auth-Referenzdokumenten.
- Rufen Sie
signInWithRedirect
auf, um sich anzumelden und zur Anmeldeseite weiterzuleiten: Beachten Sie die Best Practices für die Verwendung von „signInWithRedirect“.import { getAuth, signInWithRedirect } from "firebase/auth";
const auth = getAuth();
signInWithRedirect(auth, provider);firebase.auth().signInWithRedirect(provider);
getRedirectResult
aufrufen:import { getAuth, getRedirectResult, GoogleAuthProvider } from "firebase/auth";
const auth = getAuth();
getRedirectResult(auth)
.then((result) => {
// This gives you a Google Access Token. You can use it to access Google APIs.
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
// The signed-in user info.
const user = result.user;
// IdP data available using getAdditionalUserInfo(result)
// ...
}).catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.customData.email;
// The AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});firebase.auth()
.getRedirectResult()
.then((result) => {
if (result.credential) {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// ...
}
// The signed-in user info.
var user = result.user;
// IdP data available in result.additionalUserInfo.profile.
// ...
}).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
- Wenn Sie sich über ein Pop-up-Fenster anmelden möchten, drücken Sie
Umgang mit Fehlern vom Typ „account-exists-with-different-credential“
Wenn Sie in der Firebase-Konsole die Einstellung Ein Konto pro E-Mail-Adresse aktiviert haben und ein Nutzer versucht, sich bei einem Anbieter (z. B. Google) mit einer E-Mail-Adresse anzumelden, die bereits für den Anbieter eines anderen Firebase-Nutzers (z. B. Facebook) vorhanden ist, wird der Fehler auth/account-exists-with-different-credential
zusammen mit einem AuthCredential
-Objekt (Google-ID-Token) ausgelöst. Um die Anmeldung beim gewünschten Anbieter abzuschließen, muss sich der Nutzer zuerst beim bestehenden Anbieter (Facebook) anmelden und dann eine Verknüpfung zum ehemaligen AuthCredential
(Google-ID-Token) herstellen.
Pop-up-Modus
Wenn Sie signInWithPopup
verwenden, können Sie auth/account-exists-with-different-credential
-Fehler mit Code wie im folgenden Beispiel behandeln:
import {
getAuth,
linkWithCredential,
signInWithPopup,
GoogleAuthProvider,
} from "firebase/auth";
try {
// Step 1: User tries to sign in using Google.
let result = await signInWithPopup(getAuth(), new GoogleAuthProvider());
} catch (error) {
// Step 2: User's email already exists.
if (error.code === "auth/account-exists-with-different-credential") {
// The pending Google credential.
let pendingCred = error.credential;
// Step 3: Save the pending credential in temporary storage,
// Step 4: Let the user know that they already have an account
// but with a different provider, and let them choose another
// sign-in method.
}
}
// ...
try {
// Step 5: Sign the user in using their chosen method.
let result = await signInWithPopup(getAuth(), userSelectedProvider);
// Step 6: Link to the Google credential.
// TODO: implement `retrievePendingCred` for your app.
let pendingCred = retrievePendingCred();
if (pendingCred !== null) {
// As you have access to the pending credential, you can directly call the
// link method.
let user = await linkWithCredential(result.user, pendingCred);
}
// Step 7: Continue to app.
} catch (error) {
// ...
}
Weiterleitungsmodus
Dieser Fehler wird im Weiterleitungsmodus ähnlich behandelt, mit dem Unterschied, dass die ausstehenden Anmeldedaten zwischen den Seitenweiterleitungen im Cache gespeichert werden müssen (z. B. mit Sitzungsspeicher).
Fortgeschrittene Nutzer: Anmeldevorgang manuell verarbeiten
Sie können sich auch mit einem Google-Konto bei Firebase authentifizieren, indem Sie die Anmeldeabfolge mit der Bibliothek „Über Google anmelden“ verarbeiten:
- Binden Sie „Über Google anmelden“ in Ihre App ein. Folgen Sie dazu dem Integrationsleitfaden. Konfigurieren Sie Google Sign-In mit der Google-Client-ID, die für Ihr Firebase-Projekt generiert wurde. Sie finden die Google-Client-ID Ihres Projekts auf der Seite „Anmeldedaten“ der Developers Console Ihres Projekts.
- Tauschen Sie im Callback für das Anmeldeergebnis das ID-Token aus der Google Auth-Antwort gegen ein Firebase-Anmeldedaten aus und verwenden Sie es, um sich bei Firebase zu authentifizieren:
function handleCredentialResponse(response) {
// Build Firebase credential with the Google ID token.
const idToken = response.credential;
const credential = GoogleAuthProvider.credential(idToken);
// Sign in with credential from the Google user.
signInWithCredential(auth, credential).catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.email;
// The credential that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});
}
Fortgeschrittene Nutzer: Mit Firebase in Node.js authentifizieren
So authentifizieren Sie sich in einer Node.js-Anwendung mit Firebase:
- Melden Sie den Nutzer mit seinem Google-Konto an und rufen Sie das Google-ID-Token des Nutzers ab. Dazu gibt es mehrere Möglichkeiten. Beispiel:
- Wenn Ihre App ein Browser-Frontend hat, verwenden Sie Google Log-in wie im Abschnitt Anmeldevorgang manuell verarbeiten beschrieben. Rufe das Google-ID-Token aus der Authentifizierungsantwort ab:
Sende dieses Token dann an deine Node.js-Anwendung.var id_token = googleUser.getAuthResponse().id_token
- Wenn Ihre App auf einem Gerät mit eingeschränkten Eingabemöglichkeiten ausgeführt wird, z. B. auf einem Fernseher, können Sie den Ablauf Google-Anmeldung für Fernseher und Geräte verwenden.
- Wenn Ihre App ein Browser-Frontend hat, verwenden Sie Google Log-in wie im Abschnitt Anmeldevorgang manuell verarbeiten beschrieben. Rufe das Google-ID-Token aus der Authentifizierungsantwort ab:
- Nachdem du das Google-ID-Token des Nutzers abgerufen hast, kannst du damit ein Anmeldedatenobjekt erstellen und den Nutzer mit den Anmeldedaten anmelden:
import { getAuth, signInWithCredential, GoogleAuthProvider } from "firebase/auth";
// Build Firebase credential with the Google ID token.
const credential = GoogleAuthProvider.credential(id_token);
// Sign in with credential from the Google user.
const auth = getAuth();
signInWithCredential(auth, credential).catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.customData.email;
// The AuthCredential type that was used.
const credential = GoogleAuthProvider.credentialFromError(error);
// ...
});// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(id_token);
// Sign in with credential from the Google user.
firebase.auth().signInWithCredential(credential).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
In einer Chrome-Erweiterung mit Firebase authentifizieren
Wenn Sie eine Chrome-Erweiterung entwickeln, lesen Sie den Leitfaden zu Offscreen-Dokumenten.
Weiterleitungsdomain für die Google-Anmeldung anpassen
Beim Erstellen des Projekts stellt Firebase eine eindeutige Subdomain für Ihr Projekt bereit: https://my-app-12345.firebaseapp.com
.
Diese wird auch als Weiterleitungsmechanismus für die OAuth-Anmeldung verwendet. Diese Domain muss für alle unterstützten OAuth-Anbieter zulässig sein. Das bedeutet jedoch, dass Nutzer diese Domain möglicherweise sehen, wenn sie sich bei Google anmelden, bevor sie zur Anwendung weitergeleitet werden: Weiter zu: https://my-app-12345.firebaseapp.com.
Wenn Sie Ihre Subdomain nicht anzeigen lassen möchten, können Sie eine benutzerdefinierte Domain mit Firebase Hosting einrichten:
- Folgen Sie den Schritten 1 bis 3 unter Domain für Hosting einrichten. Wenn Sie die Inhaberschaft Ihrer Domain bestätigen, stellt Hosting ein SSL-Zertifikat für Ihre benutzerdefinierte Domain bereit.
- Fügen Sie Ihre benutzerdefinierte Domain in der Firebase-Konsole der Liste der autorisierten Domains hinzu:
auth.custom.domain.com
. - Fügen Sie in der Google Developer Console oder auf der OAuth-Einrichtungsseite die URL der Weiterleitungsseite auf die Zulassungsliste, auf die über Ihre benutzerdefinierte Domain zugegriffen werden kann:
https://auth.custom.domain.com/__/auth/handler
. - Geben Sie beim Initialisieren der JavaScript-Bibliothek Ihre benutzerdefinierte Domain im Feld
authDomain
an:var config = {
apiKey: '...',
// Changed from 'my-app-12345.firebaseapp.com'.
authDomain: 'auth.custom.domain.com',
databaseURL: 'https://my-app-12345.firebaseio.com',
projectId: 'my-app-12345',
storageBucket: 'my-app-12345.appspot.com',
messagingSenderId: '1234567890'
};
firebase.initializeApp(config);
Nächste Schritte
Nachdem sich ein Nutzer zum ersten Mal angemeldet hat, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, d. h. mit dem Nutzernamen und Passwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter, mit denen sich der Nutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps in Ihrem Projekt zu identifizieren, unabhängig davon, wie er sich anmeldet.
-
In Ihren Apps sollten Sie den Authentifizierungsstatus des Nutzers am besten über einen Beobachter für das
Auth
-Objekt ermitteln. Die grundlegenden Profilinformationen des Nutzers können Sie dann aus demUser
-Objekt abrufen. Weitere Informationen finden Sie unter Nutzer verwalten. In Ihren Firebase Realtime Database- und Cloud Storage-Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen
auth
abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.
Sie können Nutzern erlauben, sich über mehrere Authentifizierungsanbieter in Ihrer App anzumelden, indem Sie die Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.
Wenn Sie einen Nutzer abmelden möchten, rufen Sie
signOut
auf:
import { getAuth, signOut } from "firebase/auth";
const auth = getAuth();
signOut(auth).then(() => {
// Sign-out successful.
}).catch((error) => {
// An error happened.
});
firebase.auth().signOut().then(() => {
// Sign-out successful.
}).catch((error) => {
// An error happened.
});