Authentifizieren Sie sich mit Apple mit JavaScript

Sie können Ihren Benutzern die Authentifizierung bei Firebase mit ihrer Apple-ID ermöglichen, indem Sie das Firebase SDK verwenden, um den End-to-End-Anmeldevorgang mit OAuth 2.0 durchzuführen.

Bevor Sie beginnen

Um Benutzer mit Apple anzumelden, konfigurieren Sie zunächst „Mit Apple anmelden“ auf der Entwicklerseite von Apple und aktivieren Sie dann Apple als Anmeldeanbieter für Ihr Firebase-Projekt.

Treten Sie dem Apple Developer Program bei

„Mit Apple anmelden“ kann nur von Mitgliedern des Apple Developer Program konfiguriert werden.

Konfigurieren Sie die Anmeldung mit Apple

Gehen Sie auf der Apple Developer- Website wie folgt vor:

  1. Verknüpfen Sie Ihre Website mit Ihrer App, wie im ersten Abschnitt von Konfigurieren der Anmeldung mit Apple für das Web beschrieben. Wenn Sie dazu aufgefordert werden, registrieren Sie die folgende URL als Rückgabe-URL:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    Sie können Ihre Firebase-Projekt-ID auf der Einstellungsseite der Firebase-Konsole abrufen.

    Wenn Sie fertig sind, notieren Sie sich Ihre neue Service-ID, die Sie im nächsten Abschnitt benötigen.

  2. Erstellen Sie eine Anmeldung mit dem privaten Apple-Schlüssel . Im nächsten Abschnitt benötigen Sie Ihren neuen privaten Schlüssel und Ihre Schlüssel-ID.
  3. Wenn Sie eine der Firebase-Authentifizierungsfunktionen verwenden, die E-Mails an Benutzer senden, einschließlich E-Mail-Link-Anmeldung, E-Mail-Adressüberprüfung, Widerruf von Kontoänderungen und andere, konfigurieren Sie den privaten E-Mail-Relay-Dienst von Apple und registrieren Sie noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (oder Ihre benutzerdefinierte E-Mail-Vorlagendomäne), damit Apple von der Firebase-Authentifizierung gesendete E-Mails an anonymisierte Apple-E-Mail-Adressen weiterleiten kann.

Aktivieren Sie Apple als Anmeldeanbieter

  1. Fügen Sie Firebase zu Ihrem Projekt hinzu .
  2. Öffnen Sie in der Firebase-Konsole den Abschnitt „Auth“ . Aktivieren Sie auf der Registerkarte Anmeldemethode den Apple- Anbieter. Geben Sie die Service-ID an, die Sie im vorherigen Abschnitt erstellt haben. Geben Sie außerdem im Abschnitt zur Konfiguration des OAuth-Codeflusses Ihre Apple-Team-ID sowie den privaten Schlüssel und die Schlüssel-ID an, die Sie im vorherigen Abschnitt erstellt haben.

Erfüllen Sie die Anforderungen von Apple an anonymisierte Daten

„Mit Apple anmelden“ bietet Benutzern die Möglichkeit, ihre Daten, einschließlich ihrer E-Mail-Adresse, bei der Anmeldung zu anonymisieren. Benutzer, die diese Option wählen, verfügen über E-Mail-Adressen mit der Domäne privaterelay.appleid.com . Wenn Sie „Mit Apple anmelden“ in Ihrer App verwenden, müssen Sie alle geltenden Entwicklerrichtlinien oder Bedingungen von Apple in Bezug auf diese anonymisierten Apple-IDs einhalten.

Dazu gehört auch die Einholung der erforderlichen Einwilligung des Nutzers, bevor Sie direkt identifizierende personenbezogene Daten mit einer anonymisierten Apple-ID verknüpfen. Bei Verwendung der Firebase-Authentifizierung kann dies die folgenden Aktionen umfassen:

  • Verknüpfen Sie eine E-Mail-Adresse mit einer anonymisierten Apple-ID oder umgekehrt.
  • Verknüpfen Sie eine Telefonnummer mit einer anonymisierten Apple-ID oder umgekehrt
  • Verknüpfen Sie nicht anonyme soziale Anmeldeinformationen (Facebook, Google usw.) mit einer anonymisierten Apple-ID oder umgekehrt.

Die obige Liste ist nicht vollständig. Sehen Sie sich die Apple Developer Program-Lizenzvereinbarung im Abschnitt „Mitgliedschaft“ Ihres Entwicklerkontos an, um sicherzustellen, dass Ihre App die Anforderungen von Apple erfüllt.

Behandeln Sie den Anmeldevorgang mit dem Firebase SDK

Wenn Sie eine Web-App erstellen, besteht die einfachste Möglichkeit zur Authentifizierung Ihrer Benutzer bei Firebase mithilfe ihrer Apple-Konten darin, den gesamten Anmeldevorgang mit dem Firebase JavaScript SDK abzuwickeln.

Führen Sie die folgenden Schritte aus, um den Anmeldevorgang mit dem Firebase JavaScript SDK abzuwickeln:

  1. Erstellen Sie eine Instanz eines OAuthProviders mit der entsprechenden Anbieter-ID apple.com .

    Web modular API

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('apple.com');

    Web namespaced API

    var provider = new firebase.auth.OAuthProvider('apple.com');
  2. Optional: Geben Sie über den Standard hinaus zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten.

    Web modular API

    provider.addScope('email');
    provider.addScope('name');

    Web namespaced API

    provider.addScope('email');
    provider.addScope('name');

    Wenn „Ein Konto pro E-Mail-Adresse“ aktiviert ist, fordert Firebase standardmäßig E-Mail- und Namensbereiche an. Wenn Sie diese Einstellung in „Mehrere Konten pro E-Mail-Adresse“ ändern, fordert Firebase keine Bereiche von Apple an, es sei denn, Sie geben diese an.

  3. Optional: Wenn Sie den Anmeldebildschirm von Apple in einer anderen Sprache als Englisch anzeigen möchten, legen Sie den Parameter locale fest. Informationen zu den unterstützten Gebietsschemas finden Sie in der Dokumentation „Mit Apple anmelden“ .

    Web modular API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });

    Web namespaced API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });
  4. Authentifizieren Sie sich bei Firebase mithilfe des OAuth-Anbieterobjekts. Sie können Ihre Benutzer auffordern, sich mit ihren Apple-Konten anzumelden, indem Sie entweder ein Popup-Fenster öffnen oder zur Anmeldeseite weiterleiten. Auf Mobilgeräten wird die Weiterleitungsmethode bevorzugt.

    • Um sich mit einem Popup-Fenster anzumelden, rufen Sie signInWithPopup() auf:

      Web modular API

      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // The signed-in user info.
          const user = result.user;
      
          // Apple credential
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
      
          // 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 credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      Web namespaced API

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // The signed-in user info.
          var user = result.user;
      
          // You can also get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
        // ...
        })
        .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;
      
          // ...
        });
    • Um sich durch Umleitung zur Anmeldeseite anzumelden, rufen Sie signInWithRedirect() auf:

    Befolgen Sie die Best Practices bei der Verwendung signInWithRedirect , linkWithRedirect oder reauthenticateWithRedirect .

    Web modular API

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web namespaced API

    firebase.auth().signInWithRedirect(provider);

    Nachdem der Benutzer die Anmeldung abgeschlossen hat und zur Seite zurückkehrt, können Sie das Anmeldeergebnis durch Aufrufen getRedirectResult() abrufen:

    Web modular API

    import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
    
    // Result from Redirect auth flow.
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = OAuthProvider.credentialFromResult(result);
        if (credential) {
          // You can also get the Apple OAuth Access and ID Tokens.
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        }
        // The signed-in user info.
        const user = result.user;
      })
      .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 credential that was used.
        const credential = OAuthProvider.credentialFromError(error);
    
        // ...
      });

    Web namespaced API

    // Result from Redirect auth flow.
    firebase
      .auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // You can get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
    
          // IdP data available in result.additionalUserInfo.profile.
          // ...
        }
        // The signed-in user info.
        var user = result.user;
      })
      .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 erkennen und beheben. Eine Liste der Fehlercodes finden Sie in der API-Referenz .

    Im Gegensatz zu anderen von Firebase Auth unterstützten Anbietern stellt Apple keine Foto-URL bereit.

    Wenn sich der Benutzer außerdem dafür entscheidet, seine E-Mail-Adresse nicht mit der App zu teilen, stellt Apple für diesen Benutzer eine eindeutige E-Mail-Adresse (in der Form xyz@privaterelay.appleid.com ) bereit, die es mit Ihrer App teilt. Wenn Sie den privaten E-Mail-Relay-Dienst konfiguriert haben, leitet Apple an die anonymisierte Adresse gesendete E-Mails an die echte E-Mail-Adresse des Benutzers weiter.

    Apple gibt Benutzerinformationen wie den Anzeigenamen nur dann an Apps weiter, wenn sich ein Benutzer zum ersten Mal anmeldet. Normalerweise speichert Firebase den Anzeigenamen, wenn sich ein Benutzer zum ersten Mal bei Apple anmeldet. Sie können ihn mit firebase.auth().currentUser.displayName . Wenn Sie jedoch zuvor Apple verwendet haben, um einen Benutzer bei der App anzumelden, ohne Firebase zu verwenden, stellt Apple Firebase den Anzeigenamen des Benutzers nicht zur Verfügung.

Erneute Authentifizierung und Kontoverknüpfung

Das gleiche Muster kann mit reauthenticateWithPopup() und reauthenticateWithRedirect() verwendet werden, mit denen Sie neue Anmeldeinformationen für vertrauliche Vorgänge abrufen können, die eine kürzliche Anmeldung erfordern:

Web modular API

import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";

// Result from Redirect auth flow.
const auth = getAuth();
const provider = new OAuthProvider('apple.com');

reauthenticateWithPopup(auth.currentUser, provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.

    // The signed-in user info.
    const user = result.user;

    // You can also get the Apple OAuth Access and ID Tokens.
    const credential = OAuthProvider.credentialFromResult(result);
    const accessToken = credential.accessToken;
    const idToken = credential.idToken;

    // ...
  })
  .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 credential that was used.
    const credential = OAuthProvider.credentialFromError(error);

    // ...
  });

Web namespaced API

const provider = new firebase.auth.OAuthProvider('apple.com');

firebase
  .auth()
  .currentUser
  .reauthenticateWithPopup(provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.
    /** @type {firebase.auth.OAuthCredential} */
    var credential = result.credential;

    // The signed-in user info.
    var user = result.user;
     // You can also get the Apple OAuth Access and ID Tokens.
    var accessToken = credential.accessToken;
    var idToken = credential.idToken;

    // 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;

    // ...
  });

Und Sie können linkWithPopup() und linkWithRedirect() verwenden, um verschiedene Identitätsanbieter mit vorhandenen Konten zu verknüpfen.

Beachten Sie, dass Apple verlangt, dass Sie die ausdrückliche Zustimmung der Benutzer einholen, bevor Sie deren Apple-Konten mit anderen Daten verknüpfen.

Um beispielsweise ein Facebook-Konto mit dem aktuellen Firebase-Konto zu verknüpfen, verwenden Sie das Zugriffstoken, das Sie durch die Anmeldung des Benutzers bei Facebook erhalten haben:

Web modular API

import { getAuth, linkWithPopup, FacebookAuthProvider } from "firebase/auth";

const auth = getAuth();
const provider = new FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
linkWithPopup(auth.currentUser, provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // ...

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Web namespaced API

const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
firebase.auth().currentUser.linkWithPopup(provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // Facebook additional data available in result.additionalUserInfo.profile,

      // Additional Facebook OAuth access token can also be retrieved.
      // result.credential.accessToken

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Authentifizieren Sie sich mit Firebase in einer Chrome-Erweiterung

Wenn Sie eine Chrome-Erweiterungs-App erstellen, lesen Sie die Anleitung zu Offscreen-Dokumenten .

Beachten Sie, dass Sie die benutzerdefinierte Domäne weiterhin bei Apple überprüfen müssen, ähnlich wie bei der Standarddomäne firebaseapp.com:

http://auth.custom.example.com/.well-known/apple-developer-domain-association.txt

Token-Widerruf

Apple verlangt, dass Apps, die die Kontoerstellung unterstützen, Benutzern die Löschung ihres Kontos innerhalb der App ermöglichen müssen, wie in den App Store Review Guidelines beschrieben

Um diese Anforderung zu erfüllen, führen Sie die folgenden Schritte aus:

  1. Stellen Sie sicher, dass Sie den Abschnitt zur Konfiguration der Dienste-ID und des OAuth-Codeflusses der Anbieterkonfiguration „Mit Apple anmelden“ ausgefüllt haben, wie im Abschnitt „Mit Apple anmelden“ beschrieben.

  2. Da Firebase keine Benutzertokens speichert, wenn Benutzer mit „Mit Apple anmelden“ erstellt werden, müssen Sie den Benutzer bitten, sich erneut anzumelden, bevor Sie sein Token widerrufen und das Konto löschen.

    Rufen Sie dann das Apple OAuth-Zugriffstoken von OAuthCredential ab und rufen Sie damit revokeAccessToken(auth, token) auf, um das Apple OAuth-Zugriffstoken zu widerrufen.

    const provider = new OAuthProvider('apple.com');
    provider.addScope('email');
    provider.addScope('name');
    
    const auth = getAuth();
    signInWithPopup(auth, provider).then(result => {
      // Get the Apple OAuth access token.
      const credential = OAuthProvider.credentialFromResult(result);
      const accessToken = credential.accessToken;
    
      // Revoke the Apple OAuth access token.
      revokeAccessToken(auth, accessToken)
        .then(() => {
          // Token revoked.
    
          // Delete the user account.
          // ...
        })
        .catch(error => {
          // An error happened.
          // ...
        });
    });
    
  3. Löschen Sie abschließend das Benutzerkonto (und alle zugehörigen Daten).

Erweitert: Authentifizieren Sie sich mit Firebase in Node.js

So authentifizieren Sie sich bei Firebase in einer Node.js-Anwendung:

  1. Melden Sie den Benutzer mit seinem Apple-Konto an und erhalten Sie das Apple-ID-Token des Benutzers. Sie können dies auf verschiedene Arten erreichen. Wenn Ihre Node.js-App beispielsweise über ein Browser-Frontend verfügt:

    1. Generieren Sie in Ihrem Backend eine zufällige Zeichenfolge (eine „Nonce“) und berechnen Sie deren SHA256-Hash. Die Nonce ist ein einmaliger Verwendungswert, den Sie zur Validierung eines einzelnen Roundtrips zwischen Ihrem Backend und den Authentifizierungsservern von Apple verwenden.

      Web modular API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = (length) => {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        let nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');

      Web namespaced API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = function(length) {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        var nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');
    2. Geben Sie auf Ihrer Anmeldeseite die gehashte Nonce in Ihrer „Mit Apple anmelden“-Konfiguration an:

      <script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
      <div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
      <script>
          AppleID.auth.init({
              clientId: YOUR_APPLE_CLIENT_ID,
              scope: 'name email',
              redirectURI: URL_TO_YOUR_REDIRECT_HANDLER,  // See the next step.
              state: '[STATE]',  // Optional value that Apple will send back to you
                                 // so you can return users to the same context after
                                 // they sign in.
              nonce: HASHED_NONCE  // The hashed nonce you generated in the previous step.
          });
      </script>
      
    3. Holen Sie sich das Apple-ID-Token von der Serverseite der POSTed-Authentifizierungsantwort:

      app.post('/redirect', (req, res) => {
        const savedState = req.cookies.__session;
        const code = req.body.code;
        const state = req.body.state;
        const appleIdToken = req.body.id_token;
        if (savedState !== state || !code) {
          res.status(403).send('403: Permission denied');
        } else {
          // Sign in with Firebase using appleIdToken. (See next step).
        }
      });
      

    Siehe auch Konfigurieren Ihrer Webseite für die Anmeldung mit Apple .

  2. Nachdem Sie das Apple-ID-Token des Benutzers erhalten haben, erstellen Sie damit ein Credential-Objekt und melden Sie den Benutzer dann mit den Anmeldeinformationen an:

    Web modular API

    import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    
    // Build Firebase credential with the Apple ID token.
    const provider = new OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    signInWithCredential(auth, authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

    Web namespaced API

    // Build Firebase credential with the Apple ID token.
    const provider = new firebase.auth.OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    firebase.auth().signInWithCredential(authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – also dem Benutzernamen und dem Kennwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie den Authentifizierungsstatus Ihres Benutzers am besten ermitteln, indem Sie einen Beobachter für das Auth Objekt festlegen. Anschließend können Sie die grundlegenden Profilinformationen des Benutzers aus dem User abrufen. Siehe Benutzer verwalten .

  • In Ihren Firebase-Echtzeitdatenbank- und Cloud-Speicher- Sicherheitsregeln können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der auth abrufen und damit steuern, auf welche Daten ein Benutzer zugreifen kann.

Sie können Benutzern die Anmeldung bei Ihrer App mit mehreren Authentifizierungsanbietern ermöglichen, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen Sie signOut auf:

Web modular API

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web namespaced API

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});
,

Sie können Ihren Benutzern die Authentifizierung bei Firebase mit ihrer Apple-ID ermöglichen, indem Sie das Firebase SDK verwenden, um den End-to-End-Anmeldevorgang mit OAuth 2.0 durchzuführen.

Bevor Sie beginnen

Um Benutzer mit Apple anzumelden, konfigurieren Sie zunächst „Mit Apple anmelden“ auf der Entwicklerseite von Apple und aktivieren Sie dann Apple als Anmeldeanbieter für Ihr Firebase-Projekt.

Treten Sie dem Apple Developer Program bei

„Mit Apple anmelden“ kann nur von Mitgliedern des Apple Developer Program konfiguriert werden.

Konfigurieren Sie die Anmeldung mit Apple

Gehen Sie auf der Apple Developer- Website wie folgt vor:

  1. Verknüpfen Sie Ihre Website mit Ihrer App, wie im ersten Abschnitt von Konfigurieren der Anmeldung mit Apple für das Web beschrieben. Wenn Sie dazu aufgefordert werden, registrieren Sie die folgende URL als Rückgabe-URL:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    Sie können Ihre Firebase-Projekt-ID auf der Einstellungsseite der Firebase-Konsole abrufen.

    Wenn Sie fertig sind, notieren Sie sich Ihre neue Service-ID, die Sie im nächsten Abschnitt benötigen.

  2. Erstellen Sie eine Anmeldung mit dem privaten Apple-Schlüssel . Im nächsten Abschnitt benötigen Sie Ihren neuen privaten Schlüssel und Ihre Schlüssel-ID.
  3. Wenn Sie eine der Firebase-Authentifizierungsfunktionen verwenden, die E-Mails an Benutzer senden, einschließlich E-Mail-Link-Anmeldung, E-Mail-Adressüberprüfung, Widerruf von Kontoänderungen und andere, konfigurieren Sie den privaten E-Mail-Relay-Dienst von Apple und registrieren Sie noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (oder Ihre benutzerdefinierte E-Mail-Vorlagendomäne), damit Apple von der Firebase-Authentifizierung gesendete E-Mails an anonymisierte Apple-E-Mail-Adressen weiterleiten kann.

Aktivieren Sie Apple als Anmeldeanbieter

  1. Fügen Sie Firebase zu Ihrem Projekt hinzu .
  2. Öffnen Sie in der Firebase-Konsole den Abschnitt „Auth“ . Aktivieren Sie auf der Registerkarte Anmeldemethode den Apple- Anbieter. Geben Sie die Service-ID an, die Sie im vorherigen Abschnitt erstellt haben. Geben Sie außerdem im Abschnitt zur Konfiguration des OAuth-Codeflusses Ihre Apple-Team-ID sowie den privaten Schlüssel und die Schlüssel-ID an, die Sie im vorherigen Abschnitt erstellt haben.

Erfüllen Sie die Anforderungen von Apple an anonymisierte Daten

„Mit Apple anmelden“ bietet Benutzern die Möglichkeit, ihre Daten, einschließlich ihrer E-Mail-Adresse, bei der Anmeldung zu anonymisieren. Benutzer, die diese Option wählen, verfügen über E-Mail-Adressen mit der Domäne privaterelay.appleid.com . Wenn Sie „Mit Apple anmelden“ in Ihrer App verwenden, müssen Sie alle geltenden Entwicklerrichtlinien oder Bedingungen von Apple in Bezug auf diese anonymisierten Apple-IDs einhalten.

Dazu gehört auch die Einholung der erforderlichen Einwilligung des Nutzers, bevor Sie direkt identifizierende personenbezogene Daten mit einer anonymisierten Apple-ID verknüpfen. Bei Verwendung der Firebase-Authentifizierung kann dies die folgenden Aktionen umfassen:

  • Verknüpfen Sie eine E-Mail-Adresse mit einer anonymisierten Apple-ID oder umgekehrt.
  • Verknüpfen Sie eine Telefonnummer mit einer anonymisierten Apple-ID oder umgekehrt
  • Verknüpfen Sie nicht anonyme soziale Anmeldeinformationen (Facebook, Google usw.) mit einer anonymisierten Apple-ID oder umgekehrt.

Die obige Liste ist nicht vollständig. Sehen Sie sich die Apple Developer Program-Lizenzvereinbarung im Abschnitt „Mitgliedschaft“ Ihres Entwicklerkontos an, um sicherzustellen, dass Ihre App die Anforderungen von Apple erfüllt.

Behandeln Sie den Anmeldevorgang mit dem Firebase SDK

Wenn Sie eine Web-App erstellen, besteht die einfachste Möglichkeit zur Authentifizierung Ihrer Benutzer bei Firebase mithilfe ihrer Apple-Konten darin, den gesamten Anmeldevorgang mit dem Firebase JavaScript SDK abzuwickeln.

Führen Sie die folgenden Schritte aus, um den Anmeldevorgang mit dem Firebase JavaScript SDK abzuwickeln:

  1. Erstellen Sie eine Instanz eines OAuthProviders mit der entsprechenden Anbieter-ID apple.com .

    Web modular API

    import { OAuthProvider } from "firebase/auth";
    
    const provider = new OAuthProvider('apple.com');

    Web namespaced API

    var provider = new firebase.auth.OAuthProvider('apple.com');
  2. Optional: Geben Sie über den Standard hinaus zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten.

    Web modular API

    provider.addScope('email');
    provider.addScope('name');

    Web namespaced API

    provider.addScope('email');
    provider.addScope('name');

    Wenn „Ein Konto pro E-Mail-Adresse“ aktiviert ist, fordert Firebase standardmäßig E-Mail- und Namensbereiche an. Wenn Sie diese Einstellung in „Mehrere Konten pro E-Mail-Adresse“ ändern, fordert Firebase keine Bereiche von Apple an, es sei denn, Sie geben diese an.

  3. Optional: Wenn Sie den Anmeldebildschirm von Apple in einer anderen Sprache als Englisch anzeigen möchten, legen Sie den Parameter locale fest. Informationen zu den unterstützten Gebietsschemas finden Sie in der Dokumentation „Mit Apple anmelden“ .

    Web modular API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });

    Web namespaced API

    provider.setCustomParameters({
      // Localize the Apple authentication screen in French.
      locale: 'fr'
    });
  4. Authentifizieren Sie sich bei Firebase mithilfe des OAuth-Anbieterobjekts. Sie können Ihre Benutzer auffordern, sich mit ihren Apple-Konten anzumelden, indem Sie entweder ein Popup-Fenster öffnen oder zur Anmeldeseite weiterleiten. Auf Mobilgeräten wird die Weiterleitungsmethode bevorzugt.

    • Um sich mit einem Popup-Fenster anzumelden, rufen Sie signInWithPopup() auf:

      Web modular API

      import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // The signed-in user info.
          const user = result.user;
      
          // Apple credential
          const credential = OAuthProvider.credentialFromResult(result);
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
      
          // 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 credential that was used.
          const credential = OAuthProvider.credentialFromError(error);
      
          // ...
        });

      Web namespaced API

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // The signed-in user info.
          var user = result.user;
      
          // You can also get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
      
          // IdP data available using getAdditionalUserInfo(result)
        // ...
        })
        .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;
      
          // ...
        });
    • Um sich durch Umleitung zur Anmeldeseite anzumelden, rufen Sie signInWithRedirect() auf:

    Befolgen Sie die Best Practices bei der Verwendung signInWithRedirect , linkWithRedirect oder reauthenticateWithRedirect .

    Web modular API

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web namespaced API

    firebase.auth().signInWithRedirect(provider);

    Nachdem der Benutzer die Anmeldung abgeschlossen hat und zur Seite zurückkehrt, können Sie das Anmeldeergebnis durch Aufrufen getRedirectResult() abrufen:

    Web modular API

    import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth";
    
    // Result from Redirect auth flow.
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = OAuthProvider.credentialFromResult(result);
        if (credential) {
          // You can also get the Apple OAuth Access and ID Tokens.
          const accessToken = credential.accessToken;
          const idToken = credential.idToken;
        }
        // The signed-in user info.
        const user = result.user;
      })
      .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 credential that was used.
        const credential = OAuthProvider.credentialFromError(error);
    
        // ...
      });

    Web namespaced API

    // Result from Redirect auth flow.
    firebase
      .auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // You can get the Apple OAuth Access and ID Tokens.
          var accessToken = credential.accessToken;
          var idToken = credential.idToken;
    
          // IdP data available in result.additionalUserInfo.profile.
          // ...
        }
        // The signed-in user info.
        var user = result.user;
      })
      .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 erkennen und beheben. Eine Liste der Fehlercodes finden Sie in der API-Referenz .

    Im Gegensatz zu anderen von Firebase Auth unterstützten Anbietern stellt Apple keine Foto-URL bereit.

    Wenn sich der Benutzer außerdem dafür entscheidet, seine E-Mail-Adresse nicht mit der App zu teilen, stellt Apple für diesen Benutzer eine eindeutige E-Mail-Adresse (in der Form xyz@privaterelay.appleid.com ) bereit, die es mit Ihrer App teilt. Wenn Sie den privaten E-Mail-Relay-Dienst konfiguriert haben, leitet Apple an die anonymisierte Adresse gesendete E-Mails an die echte E-Mail-Adresse des Benutzers weiter.

    Apple gibt Benutzerinformationen wie den Anzeigenamen nur dann an Apps weiter, wenn sich ein Benutzer zum ersten Mal anmeldet. Normalerweise speichert Firebase den Anzeigenamen, wenn sich ein Benutzer zum ersten Mal bei Apple anmeldet. Sie können ihn mit firebase.auth().currentUser.displayName . Wenn Sie jedoch zuvor Apple verwendet haben, um einen Benutzer bei der App anzumelden, ohne Firebase zu verwenden, stellt Apple Firebase den Anzeigenamen des Benutzers nicht zur Verfügung.

Erneute Authentifizierung und Kontoverknüpfung

Das gleiche Muster kann mit reauthenticateWithPopup() und reauthenticateWithRedirect() verwendet werden, mit denen Sie neue Anmeldeinformationen für vertrauliche Vorgänge abrufen können, die eine kürzliche Anmeldung erfordern:

Web modular API

import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";

// Result from Redirect auth flow.
const auth = getAuth();
const provider = new OAuthProvider('apple.com');

reauthenticateWithPopup(auth.currentUser, provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.

    // The signed-in user info.
    const user = result.user;

    // You can also get the Apple OAuth Access and ID Tokens.
    const credential = OAuthProvider.credentialFromResult(result);
    const accessToken = credential.accessToken;
    const idToken = credential.idToken;

    // ...
  })
  .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 credential that was used.
    const credential = OAuthProvider.credentialFromError(error);

    // ...
  });

Web namespaced API

const provider = new firebase.auth.OAuthProvider('apple.com');

firebase
  .auth()
  .currentUser
  .reauthenticateWithPopup(provider)
  .then((result) => {
    // User is re-authenticated with fresh tokens minted and can perform
    // sensitive operations like account deletion, or updating their email
    // address or password.
    /** @type {firebase.auth.OAuthCredential} */
    var credential = result.credential;

    // The signed-in user info.
    var user = result.user;
     // You can also get the Apple OAuth Access and ID Tokens.
    var accessToken = credential.accessToken;
    var idToken = credential.idToken;

    // 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;

    // ...
  });

Und Sie können linkWithPopup() und linkWithRedirect() verwenden, um verschiedene Identitätsanbieter mit vorhandenen Konten zu verknüpfen.

Beachten Sie, dass Apple verlangt, dass Sie die ausdrückliche Zustimmung der Benutzer einholen, bevor Sie deren Apple-Konten mit anderen Daten verknüpfen.

Um beispielsweise ein Facebook-Konto mit dem aktuellen Firebase-Konto zu verknüpfen, verwenden Sie das Zugriffstoken, das Sie durch die Anmeldung des Benutzers bei Facebook erhalten haben:

Web modular API

import { getAuth, linkWithPopup, FacebookAuthProvider } from "firebase/auth";

const auth = getAuth();
const provider = new FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
linkWithPopup(auth.currentUser, provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // ...

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Web namespaced API

const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');

// Assuming the current user is an Apple user linking a Facebook provider.
firebase.auth().currentUser.linkWithPopup(provider)
    .then((result) => {
      // Facebook credential is linked to the current Apple user.
      // Facebook additional data available in result.additionalUserInfo.profile,

      // Additional Facebook OAuth access token can also be retrieved.
      // result.credential.accessToken

      // The user can now sign in to the same account
      // with either Apple or Facebook.
    })
    .catch((error) => {
      // Handle error.
    });

Authentifizieren Sie sich mit Firebase in einer Chrome-Erweiterung

Wenn Sie eine Chrome-Erweiterungs-App erstellen, lesen Sie die Anleitung zu Offscreen-Dokumenten .

Beachten Sie, dass Sie die benutzerdefinierte Domäne weiterhin bei Apple überprüfen müssen, ähnlich wie bei der Standarddomäne firebaseapp.com:

http://auth.custom.example.com/.well-known/apple-developer-domain-association.txt

Token-Widerruf

Apple verlangt, dass Apps, die die Kontoerstellung unterstützen, Benutzern die Löschung ihres Kontos innerhalb der App ermöglichen müssen, wie in den App Store Review Guidelines beschrieben

Um diese Anforderung zu erfüllen, führen Sie die folgenden Schritte aus:

  1. Stellen Sie sicher, dass Sie den Abschnitt zur Konfiguration der Dienste-ID und des OAuth-Codeflusses der Anbieterkonfiguration „Mit Apple anmelden“ ausgefüllt haben, wie im Abschnitt „Mit Apple anmelden“ beschrieben.

  2. Da Firebase keine Benutzertokens speichert, wenn Benutzer mit „Mit Apple anmelden“ erstellt werden, müssen Sie den Benutzer bitten, sich erneut anzumelden, bevor Sie sein Token widerrufen und das Konto löschen.

    Rufen Sie dann das Apple OAuth-Zugriffstoken von OAuthCredential ab und rufen Sie damit revokeAccessToken(auth, token) auf, um das Apple OAuth-Zugriffstoken zu widerrufen.

    const provider = new OAuthProvider('apple.com');
    provider.addScope('email');
    provider.addScope('name');
    
    const auth = getAuth();
    signInWithPopup(auth, provider).then(result => {
      // Get the Apple OAuth access token.
      const credential = OAuthProvider.credentialFromResult(result);
      const accessToken = credential.accessToken;
    
      // Revoke the Apple OAuth access token.
      revokeAccessToken(auth, accessToken)
        .then(() => {
          // Token revoked.
    
          // Delete the user account.
          // ...
        })
        .catch(error => {
          // An error happened.
          // ...
        });
    });
    
  3. Löschen Sie abschließend das Benutzerkonto (und alle zugehörigen Daten).

Erweitert: Authentifizieren Sie sich mit Firebase in Node.js

So authentifizieren Sie sich bei Firebase in einer Node.js-Anwendung:

  1. Melden Sie den Benutzer mit seinem Apple-Konto an und erhalten Sie das Apple-ID-Token des Benutzers. Sie können dies auf verschiedene Arten erreichen. Wenn Ihre Node.js-App beispielsweise über ein Browser-Frontend verfügt:

    1. Generieren Sie in Ihrem Backend eine zufällige Zeichenfolge (eine „Nonce“) und berechnen Sie deren SHA256-Hash. Die Nonce ist ein einmaliger Verwendungswert, den Sie zur Validierung eines einzelnen Roundtrips zwischen Ihrem Backend und den Authentifizierungsservern von Apple verwenden.

      Web modular API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = (length) => {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        let nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');

      Web namespaced API

      const crypto = require("crypto");
      const string_decoder = require("string_decoder");
      
      // Generate a new random string for each sign-in
      const generateNonce = function(length) {
        const decoder = new string_decoder.StringDecoder("ascii");
        const buf = Buffer.alloc(length);
        var nonce = "";
        while (nonce.length < length) {
          crypto.randomFillSync(buf);
          nonce = decoder.write(buf);
        }
        return nonce.slice(0, length);
      };
      
      const unhashedNonce = generateNonce(10);
      
      // SHA256-hashed nonce in hex
      const hashedNonceHex = crypto.createHash('sha256')
        .update(unhashedNonce).digest().toString('hex');
    2. Geben Sie auf Ihrer Anmeldeseite die gehashte Nonce in Ihrer „Mit Apple anmelden“-Konfiguration an:

      <script src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
      <div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
      <script>
          AppleID.auth.init({
              clientId: YOUR_APPLE_CLIENT_ID,
              scope: 'name email',
              redirectURI: URL_TO_YOUR_REDIRECT_HANDLER,  // See the next step.
              state: '[STATE]',  // Optional value that Apple will send back to you
                                 // so you can return users to the same context after
                                 // they sign in.
              nonce: HASHED_NONCE  // The hashed nonce you generated in the previous step.
          });
      </script>
      
    3. Holen Sie sich das Apple-ID-Token von der Serverseite der POSTed-Authentifizierungsantwort:

      app.post('/redirect', (req, res) => {
        const savedState = req.cookies.__session;
        const code = req.body.code;
        const state = req.body.state;
        const appleIdToken = req.body.id_token;
        if (savedState !== state || !code) {
          res.status(403).send('403: Permission denied');
        } else {
          // Sign in with Firebase using appleIdToken. (See next step).
        }
      });
      

    Siehe auch Konfigurieren Ihrer Webseite für die Anmeldung mit Apple .

  2. Nachdem Sie das Apple-ID-Token des Benutzers erhalten haben, erstellen Sie damit ein Credential-Objekt und melden Sie den Benutzer dann mit den Anmeldeinformationen an:

    Web modular API

    import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    
    // Build Firebase credential with the Apple ID token.
    const provider = new OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    signInWithCredential(auth, authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

    Web namespaced API

    // Build Firebase credential with the Apple ID token.
    const provider = new firebase.auth.OAuthProvider('apple.com');
    const authCredential = provider.credential({
      idToken: appleIdToken,
      rawNonce: unhashedNonce,
    });
    
    // Sign in with credential form the Apple user.
    firebase.auth().signInWithCredential(authCredential)
      .then((result) => {
        // User signed in.
      })
      .catch((error) => {
        // An error occurred. If error.code == 'auth/missing-or-invalid-nonce',
        // make sure you're sending the SHA256-hashed nonce as a hex string
        // with your request to Apple.
        console.log(error);
      });

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – also dem Benutzernamen und dem Kennwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie den Authentifizierungsstatus Ihres Benutzers am besten ermitteln, indem Sie einen Beobachter für das Auth Objekt festlegen. Anschließend können Sie die grundlegenden Profilinformationen des Benutzers aus dem User abrufen. Siehe Benutzer verwalten .

  • In Ihren Firebase-Echtzeitdatenbank- und Cloud-Speicher- Sicherheitsregeln können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der auth abrufen und damit steuern, auf welche Daten ein Benutzer zugreifen kann.

Sie können Benutzern ermöglichen, sich mit mehreren Authentifizierungsanbietern bei Ihrer App anzumelden, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen Sie signOut auf:

Web modular API

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

Web namespaced API

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});