Authentifizieren Sie sich mit GitHub mit JavaScript

Sie können es Ihren Benutzern ermöglichen, sich mit ihren GitHub-Konten bei Firebase zu authentifizieren, indem Sie die GitHub-Authentifizierung in Ihre App integrieren. Sie können die GitHub-Authentifizierung integrieren, indem Sie entweder das Firebase SDK verwenden, um den Anmeldeablauf auszuführen, oder indem Sie den GitHub OAuth 2.0-Ablauf manuell ausführen und das resultierende Zugriffstoken an Firebase übergeben.

Bevor Sie beginnen

  1. Fügen Sie Ihrem JavaScript-Projekt Firebase hinzu .
  2. Öffnen Sie in der Firebase-Konsole den Abschnitt Auth .
  3. Aktivieren Sie auf der Registerkarte Anmeldemethode den GitHub- Anbieter.
  4. Fügen Sie die Client-ID und das Client-Geheimnis aus der Entwicklerkonsole dieses Anbieters zur Anbieterkonfiguration hinzu:
    1. Registrieren Sie Ihre App als Entwickleranwendung auf GitHub und erhalten Sie die OAuth 2.0- Client-ID und das Clientgeheimnis Ihrer App.
    2. Stellen Sie sicher, dass Ihr Firebase- OAuth-Umleitungs-URI (z. B. my-app-12345.firebaseapp.com/__/auth/handler ) als Rückruf-URL für die Autorisierung auf der Einstellungsseite Ihrer App in der Konfiguration Ihrer GitHub-App festgelegt ist .
  5. Klicken Sie auf Speichern .

Behandeln Sie den Anmeldevorgang mit dem Firebase SDK

Wenn Sie eine Web-App erstellen, können Sie Ihre Benutzer am einfachsten mithilfe ihrer GitHub-Konten bei Firebase authentifizieren, indem Sie den Anmeldevorgang mit dem Firebase JavaScript SDK abwickeln. (Wenn Sie einen Benutzer in Node.js oder einer anderen Nicht-Browser-Umgebung authentifizieren möchten, müssen Sie den Anmeldeablauf manuell handhaben.)

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

  1. Erstellen Sie eine Instanz des GitHub-Anbieterobjekts:

    Web version 9

    import { GithubAuthProvider } from "firebase/auth";
    
    const provider = new GithubAuthProvider();

    Web version 8

    var provider = new firebase.auth.GithubAuthProvider();
  2. Optional : Geben Sie zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten. Um einen Bereich hinzuzufügen, rufen addScope . Zum Beispiel:

    Web version 9

    provider.addScope('repo');

    Web version 8

    provider.addScope('repo');
    Weitere Informationen finden Sie in der Dokumentation des Authentifizierungsanbieters .
  3. Optional : Geben Sie zusätzliche benutzerdefinierte OAuth-Anbieterparameter an, die Sie mit der OAuth-Anforderung senden möchten. Um einen benutzerdefinierten Parameter hinzuzufügen, rufen setCustomParameters für den initialisierten Anbieter mit einem Objekt auf, das den Schlüssel enthält, wie in der OAuth-Anbieterdokumentation angegeben, und den entsprechenden Wert. Zum Beispiel:

    Web version 9

    provider.setCustomParameters({
      'allow_signup': 'false'
    });

    Web version 8

    provider.setCustomParameters({
      'allow_signup': 'false'
    });
    Reservierte erforderliche OAuth-Parameter sind nicht zulässig und werden ignoriert. Weitere Einzelheiten finden Sie in der Referenz zum Authentifizierungsanbieter .
  4. Authentifizieren Sie sich bei Firebase mithilfe des GitHub-Anbieterobjekts. Sie können Ihre Benutzer auffordern, sich mit ihren GitHub-Konten anzumelden, indem Sie entweder ein Popup-Fenster öffnen oder auf die Anmeldeseite umleiten. Die Umleitungsmethode wird auf Mobilgeräten bevorzugt.
    • Um sich mit einem Popup-Fenster anzumelden, rufen signInWithPopup :

      Web version 9

      import { getAuth, signInWithPopup, GithubAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // This gives you a GitHub Access Token. You can use it to access the GitHub API.
          const credential = GithubAuthProvider.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 = GithubAuthProvider.credentialFromError(error);
          // ...
        });

      Web version 8

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // This gives you a GitHub Access Token. You can use it to access the GitHub 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;
          // ...
        });
      Beachten Sie auch, dass Sie das OAuth-Token des GitHub-Anbieters abrufen können, das zum Abrufen zusätzlicher Daten mithilfe der GitHub-APIs verwendet werden kann.

      Hier können Sie auch Fehler abfangen und behandeln. Eine Liste der Fehlercodes finden Sie in den Auth Reference Docs .

    • Rufen Sie zur Anmeldung durch Umleitung zur signInWithRedirect : Befolgen Sie die Best Practices bei der Verwendung von „signInWithRedirect“.

      Web version 9

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

      Web version 8

      firebase.auth().signInWithRedirect(provider);
      Dann können Sie auch das OAuth-Token des GitHub-Anbieters abrufen, indem Sie beim Laden Ihrer Seite getRedirectResult aufrufen:

      Web version 9

      import { getAuth, getRedirectResult, GithubAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      getRedirectResult(auth)
        .then((result) => {
          const credential = GithubAuthProvider.credentialFromResult(result);
          if (credential) {
            // This gives you a GitHub Access Token. You can use it to access the GitHub API.
            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 = GithubAuthProvider.credentialFromError(error);
          // ...
        });

      Web version 8

      firebase.auth()
        .getRedirectResult()
        .then((result) => {
          if (result.credential) {
            /** @type {firebase.auth.OAuthCredential} */
            var credential = result.credential;
      
            // This gives you a GitHub Access Token. You can use it to access the GitHub 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 finden Sie in den Auth Reference Docs .

Behandeln Sie den Anmeldefluss manuell

Sie können sich auch mit einem GitHub-Konto bei Firebase authentifizieren, indem Sie den Anmeldeablauf durch Aufrufen der GitHub-OAuth-2.0-Endpunkte handhaben:

  1. Integrieren Sie die GitHub-Authentifizierung in Ihre App, indem Sie der Entwicklerdokumentation folgen . Am Ende des GitHub-Anmeldeablaufs erhalten Sie ein OAuth 2.0-Zugriffstoken.
  2. Wenn Sie sich bei einer Node.js-Anwendung anmelden müssen, senden Sie das OAuth-Zugriffstoken an die Node.js-Anwendung.
  3. Nachdem sich ein Benutzer erfolgreich bei GitHub angemeldet hat, tauschen Sie das OAuth 2.0-Zugriffstoken gegen Firebase-Anmeldeinformationen aus:

    Web version 9

    import { GithubAuthProvider } from "firebase/auth";
    
    const credential = GithubAuthProvider.credential(token);

    Web version 8

    var credential = firebase.auth.GithubAuthProvider.credential(token);
  4. Authentifizieren Sie sich bei Firebase mit den Firebase-Anmeldeinformationen:

    Web version 9

    import { getAuth, signInWithCredential } from "firebase/auth";
    
    // Sign in with the credential from the user.
    const auth = getAuth();
    signInWithCredential(auth, credential)
      .then((result) => {
        // Signed in 
        // ...
      })
      .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;
        // ...
      });

    Web version 8

    // Sign in with the credential from the user.
    firebase.auth()
      .signInWithCredential(credential)
      .then((result) => {
        // Signed in 
        // ...
      })
      .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;
        // ...
      });

Authentifizieren Sie sich mit Firebase in einer Chrome-Erweiterung

Wenn Sie eine Chrome-Erweiterungs-App erstellen, müssen Sie Ihre Chrome-Erweiterungs-ID hinzufügen:

  1. Öffnen Sie Ihr Projekt in der Firebase-Konsole .
  2. Öffnen Sie im Abschnitt Authentifizierung die Seite Anmeldemethode .
  3. Fügen Sie der Liste der autorisierten Domänen einen URI wie den folgenden hinzu:
    chrome-extension://CHROME_EXTENSION_ID

Für Chrome-Erweiterungen sind nur Popup-Vorgänge ( signInWithPopup , linkWithPopup und reauthenticateWithPopup ) verfügbar, da Chrome-Erweiterungen keine HTTP-Weiterleitungen verwenden können. Sie sollten diese Methoden von einem Hintergrundseitenskript und nicht von einem Browseraktions-Popup aufrufen, da das Authentifizierungs-Popup das Browseraktions-Popup abbricht. Die Popup-Methoden dürfen nur in Erweiterungen mit Manifest V2 verwendet werden. Das neuere Manifest V3 erlaubt nur Hintergrundskripte in Form von Service Workern, die die Popup-Operationen gar nicht durchführen können.

Stellen Sie in der Manifestdatei Ihrer Chrome-Erweiterung sicher, dass Sie die URL https://apis.google.com zur Zulassungsliste content_security_policy hinzufügen.

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen verknüpft – d. h. dem Benutzernamen und Kennwort, der Telefonnummer oder den Authentifizierungsanbieterinformationen –, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps besteht die empfohlene Möglichkeit, den Authentifizierungsstatus Ihres Benutzers zu erfahren, darin, einen Beobachter für das Auth festzulegen. Sie können dann die grundlegenden Profilinformationen des Benutzers aus dem User abrufen. Siehe Benutzer verwalten .

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

Sie können Benutzern erlauben, 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 signOut :

Web version 9

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

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

Web version 8

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