אימות שימוש ב-Google באמצעות JavaScript

אתם יכולים לאפשר למשתמשים לבצע אימות ב-Firebase באמצעות חשבונות Google שלהם. אפשר להשתמש ב-Firebase SDK כדי לבצע את תהליך הכניסה באמצעות חשבון Google, או לבצע את תהליך הכניסה באופן ידני באמצעות הספרייה Sign In With Google ולהעביר את אסימון המזהה שנוצר ל-Firebase.

לפני שמתחילים

  1. מוסיפים את Firebase לפרויקט JavaScript.
  2. מפעילים את Google כשיטת כניסה במסוף Firebase:
    1. במסוף Firebase, פותחים את הקטע Auth.
    2. בכרטיסייה Sign in method, מפעילים את שיטת הכניסה Google ולוחצים על Save.

טיפול בתהליך הכניסה באמצעות Firebase SDK

אם אתם מפתחים אפליקציית אינטרנט, הדרך הקלה ביותר לאמת את המשתמשים ב-Firebase באמצעות חשבונות Google שלהם היא לטפל בתהליך הכניסה באמצעות Firebase JavaScript SDK. (אם רוצים לאמת משתמש ב-Node.js או בסביבה אחרת שאינה דפדפן, צריך לטפל בתהליך הכניסה באופן ידני).

כדי לטפל בתהליך הכניסה באמצעות Firebase JavaScript SDK:

  1. יוצרים מופע של אובייקט הספק של Google:
    WebWeb
    import { GoogleAuthProvider } from "firebase/auth";

    const provider = new GoogleAuthProvider();
    var provider = new firebase.auth.GoogleAuthProvider();
  2. אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 שרוצים לבקש מספק האימות. כדי להוסיף היקף, קוראים ל-addScope. לדוגמה:
    WebWeb
    provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
    provider.addScope('https://www.googleapis.com/auth/contacts.readonly');
    במסמכי התיעוד של ספק האימות
  3. אופציונלי: כדי להתאים את תהליך ה-OAuth של הספק לשפה המועדפת על המשתמש בלי להעביר באופן מפורש את הפרמטרים המותאמים אישית הרלוונטיים של OAuth, מעדכנים את קוד השפה במכונה של Auth לפני שמתחילים את תהליך ה-OAuth. לדוגמה:
    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. אופציונלי: מציינים פרמטרים מותאמים אישית נוספים של ספק OAuth שרוצים לשלוח עם בקשת ה-OAuth. כדי להוסיף פרמטר מותאם אישית, צריך להפעיל את setCustomParameters במסגרת הספק שהותחל עם אובייקט שמכיל את המפתח כפי שמפורט במסמכי העזרה של ספק OAuth, ואת הערך התואם. לדוגמה:
    WebWeb
    provider.setCustomParameters({
     
    'login_hint': 'user@example.com'
    });
    provider.setCustomParameters({
     
    'login_hint': 'user@example.com'
    });
    אסור להשתמש בפרמטרים נדרשים שמורים של OAuth, והמערכת תתעלם מהם. פרטים נוספים זמינים במאמר העזרה בנושא ספקי אימות.
  5. אימות באמצעות Firebase באמצעות אובייקט הספק של Google. אתם יכולים לבקש מהמשתמשים להיכנס באמצעות חשבונות Google שלהם על ידי פתיחת חלון קופץ או על ידי הפניה לדף הכניסה. השיטה להפניה אוטומטית היא המועדפת במכשירים ניידים.
    • כדי להיכנס באמצעות חלון קופץ, צריך לבצע את הפעולות הבאות: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;
         
      // ...
       
      });
      שימו לב שאפשר לאחזר את אסימון ה-OAuth של ספק Google, שאפשר להשתמש בו כדי לאחזר נתונים נוספים באמצעות ממשקי ה-API של Google.

      כאן אפשר גם לזהות ולטפל בשגיאות. רשימה של קודי שגיאה מופיעה במאמר חומר העזר בנושא אימות.

    • כדי להיכנס לחשבון על ידי הפניה לדף הכניסה, צריך לבצע קריאה ל-signInWithRedirect: יש לפעול לפי השיטות המומלצות כשמשתמשים ב-`signInWithRedirect`.
      WebWeb
      import { getAuth, signInWithRedirect } from "firebase/auth";

      const auth = getAuth();
      signInWithRedirect
      (auth, provider);
      firebase.auth().signInWithRedirect(provider);
      לאחר מכן, תוכלו גם לאחזר את אסימון ה-OAuth של ספק Google על ידי קריאה ל-getRedirectResult כשהדף נטען:
      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;
         
      // ...
       
      });
      כאן אפשר גם לזהות ולטפל בשגיאות. רשימה של קודי שגיאה מופיעה במאמר חומר העזר בנושא אימות.

אם הפעלתם את ההגדרה One account per email address (חשבון אחד לכל כתובת אימייל) במסוף Firebase, כשמשתמש ינסה להיכנס לספק (כמו Google) באמצעות כתובת אימייל שכבר קיימת אצל ספק אחר של משתמש ב-Firebase (כמו Facebook), תוצג הודעת השגיאה auth/account-exists-with-different-credential יחד עם אובייקט AuthCredential (אסימון מזהה של Google). כדי להשלים את הכניסה לספק המיועד, המשתמש צריך להיכנס קודם לספק הקיים (Facebook) ואז לקשר ל-AuthCredential הקודם (טוקן מזהה Google).

אם אתם משתמשים ב-signInWithPopup, תוכלו לטפל בשגיאות auth/account-exists-with-different-credential באמצעות קוד כמו הדוגמה הבאה:

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

מצב ניתוב אוטומטי

הטיפול בשגיאה הזו דומה במצב ההפניה האוטומטית, עם ההבדל שצריך לשמור את פרטי הכניסה בהמתנה במטמון בין ההפניות האוטומטיות של הדפים (לדוגמה, באמצעות אחסון הסשן).

אפשר גם לבצע אימות ב-Firebase באמצעות חשבון Google, על ידי טיפול בתהליך הכניסה באמצעות הספרייה 'כניסה באמצעות חשבון Google':

  1. כדי לשלב את 'כניסה באמצעות חשבון Google' באפליקציה, פועלים לפי מדריך השילוב. חשוב להגדיר את הכניסה באמצעות חשבון Google באמצעות מזהה הלקוח של Google שנוצר לפרויקט Firebase. מזהה הלקוח של Google בפרויקט מופיע בדף פרטי הכניסה של הפרויקט במסוף הפיתוח.
  2. בקריאה החוזרת (callback) עם תוצאת הכניסה, מחליפים את אסימון המזהה מהתגובה לאימות של Google בפרטי כניסה ל-Firebase ומשתמשים בהם כדי לבצע אימות ב-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);
       
    // ...
     
    });
    }

כדי לבצע אימות באמצעות Firebase באפליקציה של Node.js:

  1. נכנסים עם המשתמש לחשבון Google שלו ומקבלים את האסימון של מזהה Google שלו. יש כמה דרכים לעשות זאת. לדוגמה:
    • אם לאפליקציה יש ממשק קצה בדפדפן, צריך להשתמש בכניסה באמצעות חשבון Google כפי שמתואר בקטע טיפול בתהליך הכניסה באופן ידני. מקבלים את Google ID token מהתגובה של האימות:
      var id_token = googleUser.getAuthResponse().id_token
      לאחר מכן שולחים את הטוקן הזה לאפליקציית Node.js.
    • אם האפליקציה פועלת במכשיר עם יכולות קלט מוגבלות, כמו טלוויזיה, אפשר להשתמש בתהליך כניסה לחשבון Google בטלוויזיות ובמכשירים.
  2. אחרי שמקבלים את אסימון מזהה Google של המשתמש, משתמשים בו כדי ליצור אובייקט Credential ואז נכנסים עם פרטי הכניסה של המשתמש:
    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;
     
    // ...
    });

אימות באמצעות Firebase בתוסף ל-Chrome

אם אתם מפתחים אפליקציה בתור תוסף ל-Chrome, כדאי לעיין במדריך בנושא מסמכים מחוץ למסך.

בזמן יצירת הפרויקט, מערכת Firebase תקצה תת-דומיין ייחודי לפרויקט: https://my-app-12345.firebaseapp.com.

הוא ישמש גם כמנגנון להפניה אוטומטית לכניסה באמצעות OAuth. צריך להעניק הרשאה לדומיין הזה לכל ספקי OAuth הנתמכים. עם זאת, פירוש הדבר הוא שהמשתמשים עשויים לראות את הדומיין הזה בזמן הכניסה ל-Google, לפני שהם מועברים לאפליקציה: המשך לכתובת: https://my-app-12345.firebaseapp.com.

כדי למנוע הצגה של תת-הדומיין, אפשר להגדיר דומיין מותאם אישית באמצעות Firebase Hosting:

  1. פועלים לפי השלבים 1 עד 3 במאמר הגדרת הדומיין ל-Hosting. אחרי שתאמתו את הבעלות על הדומיין, Hosting יקצה אישור SSL לדומיין המותאם אישית.
  2. מוסיפים את הדומיין המותאם אישית לרשימת הדומיינים המורשים במסוף Firebase: auth.custom.domain.com.
  3. במסוף הפיתוח של Google או בדף ההגדרה של OAuth, מוסיפים לרשימת ההיתרים את כתובת ה-URL של דף ההפניה האוטומטית, שאפשר יהיה לגשת אליה בדומיין המותאם אישית: https://auth.custom.domain.com/__/auth/handler.
  4. כשמאתחלים את ספריית ה-JavaScript, מציינים את הדומיין המותאם אישית בשדה authDomain:
    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);

השלבים הבאים

אחרי שמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה מאוחסן כחלק מפרויקט Firebase, וניתן להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט, ללא קשר לאופן שבו המשתמש נכנס לחשבון.

  • באפליקציות, הדרך המומלצת לדעת את סטטוס האימות של המשתמש היא להגדיר משתמש שמתבונן באובייקט Auth. לאחר מכן תוכלו לקבל את פרטי הפרופיל הבסיסיים של המשתמש מהאובייקט User. למידע נוסף, ראו ניהול משתמשים.

  • בכללי האבטחה של Firebase Realtime Database ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש שנכנס לחשבון מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים למשתמש תהיה גישה.

כדי לאפשר למשתמשים להיכנס לאפליקציה באמצעות כמה ספקי אימות, אפשר לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים.

כדי להוציא משתמש, קוראים לפונקציה 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.
});