Uwierzytelniaj przez Google za pomocą JavaScriptu

Możesz zezwolić użytkownikom na uwierzytelnianie w Firebase za pomocą kont Google. Możesz użyć pakietu SDK Firebase, aby zalogować się przez Google, lub zaloguj się ręcznie za pomocą biblioteki Zaloguj się przez Google, przekazując uzyskany token identyfikatora do Firebase.

Zanim zaczniesz

  1. Dodaj Firebase do projektu JavaScript.
  2. Włącz Google jako metodę logowania w konsoli Firebase:
    1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
    2. Na karcie Metoda logowania włącz metodę logowania Google. i kliknij Zapisz.

Zarejestruj się za pomocą pakietu SDK Firebase

Jeśli tworzysz aplikację internetową, najprostszy sposób uwierzytelniania użytkowników korzystając z Firebase na swoich kontach Google, proces logowania odbywa się za pomocą pakiet SDK Firebase JavaScript. (Jeśli chcesz uwierzytelnić użytkownika w Node.js lub w innym środowisku, które nie jest przeglądarką, musisz samodzielnie przeprowadzić logowanie).

Aby zalogować się za pomocą pakietu SDK Firebase JavaScript, postępuj zgodnie z tymi wskazówkami kroki:

  1. Utwórz instancję obiektu dostawcy Google:
    WebWeb
    import { GoogleAuthProvider } from "firebase/auth";
    
    const provider = new GoogleAuthProvider();
    var provider = new firebase.auth.GoogleAuthProvider();
  2. Opcjonalnie: określ dodatkowe zakresy OAuth 2.0, których potrzebujesz których chcesz żądać od dostawcy uwierzytelniania. Aby dodać zakres, wywołaj addScope Przykład:
    WebWeb
    provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
    provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
    Zobacz dostawcę uwierzytelniania dokumentacji.
  3. Opcjonalnie: aby zlokalizować przepływ OAuth dostawcy na preferowany przez użytkownika bez jawnego przekazywania odpowiednich niestandardowych parametrów OAuth, zaktualizuj język w instancji Auth przed rozpoczęciem procesu OAuth. Przykład:
    WebWeb
    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();
  4. Opcjonalnie: określ dodatkowe niestandardowe parametry dostawcy OAuth. które chcesz wysyłać z żądaniem OAuth. Aby dodać parametr niestandardowy, wywołaj setCustomParameters u zainicjowanego dostawcy z obiektem zawierającym klucz zgodnie z dokumentacją dostawcy OAuth i odpowiednią wartością. Przykład:
    WebWeb
    provider.setCustomParameters({
      'login_hint': 'user@example.com'
    });
    provider.setCustomParameters({
      'login_hint': 'user@example.com'
    });
    Zarezerwowane wymagane parametry OAuth są niedozwolone i będą ignorowane. Zobacz odniesienie do dostawcy uwierzytelniania, aby dowiedzieć się więcej.
  5. Uwierzytelnij w Firebase za pomocą obiektu dostawcy Google. Dostępne opcje poproś użytkowników o zalogowanie się na swoje konta Google albo otwórz pojawi się wyskakujące okienko lub przekierujemy Cię na stronę logowania. Metoda przekierowania to na urządzeniach mobilnych.
    • Aby zalogować się za pomocą wyskakującego okienka, zadzwoń pod numer signInWithPopup:
      WebWeb
      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;
          // ...
        });
      Zwróć też uwagę, że możesz pobrać token OAuth dostawcy Google, za pomocą którego można pobrać dodatkowe dane za pomocą interfejsów API Google.

      Możesz w nim też wykrywać i poprawiać błędy. Listę kodów błędów znajdziesz w dokumentacji referencyjnej uwierzytelniania.

    • Aby zalogować się, przekierowując na stronę logowania, zadzwoń pod numer signInWithRedirect: Podczas korzystania z metody „signInWithRedirect” postępuj zgodnie ze sprawdzonymi metodami.
      WebWeb
      import { getAuth, signInWithRedirect } from "firebase/auth";
      
      const auth = getAuth();
      signInWithRedirect(auth, provider);
      firebase.auth().signInWithRedirect(provider);
      Token OAuth dostawcy Google możesz też pobrać, wywołując getRedirectResult po załadowaniu strony:
      WebWeb
      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;
          // ...
        });
      Możesz w nim też wykrywać i poprawiać błędy. Listę kodów błędów znajdziesz w dokumentacji referencyjnej uwierzytelniania.

Jeśli w konsoli Firebase masz włączone ustawienie Jedno konto na każdy adres e-mail, gdy użytkownik próbuje zalogować się na konto dostawcy (np. Google) przy użyciu adresu e-mail, który istnieje dla dostawcy innego użytkownika Firebase (np. Facebooka), błąd auth/account-exists-with-different-credential został rzucany razem z piłką Obiekt AuthCredential (token identyfikatora Google). Aby dokończyć logowanie się w do dostawcy usług, użytkownik musi najpierw zalogować się do istniejącego dostawcy (Facebooka), a następnie dodać link poprzedni identyfikator AuthCredential (token identyfikatora Google).

Jeśli używasz narzędzia signInWithPopup, możesz obsłużyć auth/account-exists-with-different-credential błędu z kodem podobnym do tego przykład:

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) {
  // ...
}

Tryb przekierowania

Ten błąd jest obsługiwany w podobny sposób w trybie przekierowania z tą różnicą, że oczekująca dane logowania muszą być zapisane w pamięci podręcznej między przekierowaniami stron (np. przy użyciu pamięci sesji).

Możesz również uwierzytelnić się w Firebase za pomocą konta Google, wykonując możesz zalogować się w bibliotece Zaloguj się przez Google:

  1. Zintegruj funkcję Zaloguj się przez Google z aplikacją, postępując zgodnie z instrukcjami przewodnik po integracji. Pamiętaj, aby skonfigurować Logowanie przez Google za pomocą identyfikatora klienta Google wygenerowanego dla Twojego projektu Firebase. Identyfikator klienta Google projektu znajdziesz na stronie Dane logowania w Developers Console.
  2. W wywołaniu zwrotnym wyniku logowania wymień token identyfikatora z odpowiedzi uwierzytelniania Google dla danych logowania Firebase i użyj go do uwierzytelnienia w Firebase:
    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);
        // ...
      });
    }

Aby uwierzytelnić się w Firebase w aplikacji Node.js:

  1. Logowanie użytkownika na jego konto Google i uzyskiwanie jego identyfikatora Google token. Możesz to osiągnąć na kilka sposobów. np.:
    • Jeśli Twoja aplikacja ma interfejs przeglądarki, użyj Logowania przez Google w sposób opisany w sekcji Obsługa logowania się ręcznie. Uzyskiwanie tokena identyfikatora Google z uwierzytelniania odpowiedź:
      var id_token = googleUser.getAuthResponse().id_token
      Następnie wyślij ten token do aplikacji Node.js.
    • Jeśli Twoja aplikacja działa na urządzeniu z ograniczonymi możliwościami wprowadzania danych, takimi jak TV, możesz użyć Google Instrukcje logowania się na telewizorach i urządzeniach
  2. Gdy uzyskasz token identyfikatora Google użytkownika, użyj go do utworzenia danych uwierzytelniających i zaloguj się za pomocą danych logowania:
    WebWeb
    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;
      // ...
    });

Uwierzytelnianie za pomocą Firebase w rozszerzeniu do Chrome

Jeśli tworzysz aplikację rozszerzenia do Chrome, zapoznaj się z Przewodnik po dokumentach poza ekranem

Podczas tworzenia projektu Firebase udostępni dla niego unikalną subdomenę: https://my-app-12345.firebaseapp.com

Będzie ona również używana jako mechanizm przekierowania logowania OAuth. Ta domena musi być jest dozwolony dla wszystkich obsługiwanych dostawców protokołu OAuth. Oznacza to jednak, że użytkownicy mogą zobaczyć, domeny podczas logowania się w Google, a następnie następuje przekierowanie z powrotem do aplikacji: Otwórz stronę https://my-app-12345.firebaseapp.com.

Aby uniknąć wyświetlania Twojej subdomeny, możesz skonfigurować domenę niestandardową za pomocą Firebase Hosting:

  1. Wykonaj kroki od 1 do 3 w Skonfiguruj domenę dla usługi Hosting. Po weryfikacji Twojej własności domeny, Hosting udostępnia certyfikat SSL dla Twojej domeny niestandardowej.
  2. Dodaj swoją domenę niestandardową do listy autoryzowanych domen w Konsola Firebase: auth.custom.domain.com.
  3. W konsoli programisty Google lub na stronie konfiguracji OAuth dodaj adres URL strony przekierowania do białej listy. które będą dostępne w Twojej domenie niestandardowej: https://auth.custom.domain.com/__/auth/handler
  4. Po zainicjowaniu biblioteki JavaScript określ domenę niestandardową za pomocą atrybutu Pole authDomain:
    var config = {
      apiKey: '...',
      // Changed from 'PROJECT_ID.firebaseapp.com'.
      authDomain: 'auth.custom.domain.com',
      databaseURL: 'https://PROJECT_ID.firebaseio.com',
      projectId: 'PROJECT_ID',
      storageBucket: 'PROJECT_ID.firebasestorage.app',
      messagingSenderId: 'SENDER_ID'
    };
    firebase.initializeApp(config);

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, tworzone jest nowe konto użytkownika. powiązane z danymi logowania, czyli z nazwą użytkownika, hasłem i numerem telefonu, numer telefonu lub informacje o dostawcy uwierzytelniania – użytkownik zalogowany. Ten nowy jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od tego, jak się loguje.

  • Aby poznać stan uwierzytelniania użytkownika w swoich aplikacjach, ustaw obserwatora na obiekcie Auth. Dzięki temu możesz uzyskać dane użytkownika podstawowych informacji o profilu z obiektu User. Zobacz Zarządzanie użytkownikami

  • Na liście Firebase Realtime Database i Cloud Storage regułami zabezpieczeń, pobierz ze zmiennej auth unikalny identyfikator zalogowanego użytkownika, i używać ich do kontrolowania, do jakich danych użytkownik ma dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu wielokrotnego uwierzytelniania. dostawców, łącząc dane logowania dostawcy uwierzytelniania z istniejącego konta użytkownika.

Aby wylogować użytkownika, wywołaj signOut:

WebWeb
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.
});