אימות באמצעות GitHub עם JavaScript

אתם יכולים לשלב אימות של GitHub באפליקציה שלכם כדי לאפשר למשתמשים להתאמת ל-Firebase באמצעות חשבונות GitHub שלהם. אפשר לשלב אימות של GitHub באמצעות Firebase SDK כדי לבצע את תהליך הכניסה, או לבצע את הרשאה באמצעות OAuth 2.0 של GitHub באופן ידני ולהעביר את טוקן הגישה שמתקבל ל-Firebase.

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

  1. מוסיפים את Firebase לפרויקט ב-JavaScript.
  2. במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
  3. בכרטיסייה Sign-in method (שיטת כניסה), מפעילים את ספק הכניסה GitHub.
  4. מוסיפים את מזהה הלקוח ואת סוד הלקוח ממסוף המפתחים של הספק להגדרות הספק:
    1. רושמים את האפליקציה כאפליקציית מפתחים ב-GitHub ומקבלים את מזהה הלקוח ואת הסוד של הלקוח של OAuth 2.0 של האפליקציה.
    2. מוודאים שכתובת ה-URI להפניה אוטומטית של OAuth ב-Firebase (לדוגמה, my-app-12345.firebaseapp.com/__/auth/handler) מוגדרת ככתובת ה-URL של הקריאה החוזרת לאימות בדף ההגדרות של האפליקציה בהגדרות של אפליקציית GitHub.
  5. לוחצים על שמירה.

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

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

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

  1. יוצרים מופע של אובייקט ספק GitHub:

    Web

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

    Web

    var provider = new firebase.auth.GithubAuthProvider();
  2. אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 שרוצים לבקש מספק האימות. כדי להוסיף היקף, מתקשרים אל addScope. לדוגמה:

    Web

    provider.addScope('repo');

    Web

    provider.addScope('repo');
    מידע נוסף על ספק האימות
  3. אופציונלי: מציינים פרמטרים נוספים של ספק OAuth מותאם אישית שרוצים לשלוח עם בקשת ה-OAuth. כדי להוסיף פרמטר מותאם אישית, קוראים ל-setCustomParameters בספק שאותחל עם אובייקט שמכיל את המפתח כפי שמצוין במסמכי התיעוד של ספק OAuth ואת הערך התואם. לדוגמה:

    Web

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

    Web

    provider.setCustomParameters({
      'allow_signup': 'false'
    });
    אסור להשתמש בפרמטרים שמורים של OAuth, והמערכת תתעלם מהם. פרטים נוספים מופיעים במאמר בנושא ספק אימות.
  4. מתבצע אימות באמצעות Firebase באמצעות אובייקט הספק של GitHub. אתם יכולים לבקש מהמשתמשים להיכנס לחשבונות שלהם ב-GitHub על ידי פתיחת חלון קופץ או על ידי הפניה לדף הכניסה. שיטת ההפניה האוטומטית מועדפת במכשירים ניידים.
    • כדי להיכנס באמצעות חלון קופץ, קוראים לפונקציה signInWithPopup:

      Web

      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

      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;
          // ...
        });
      שימו לב שאפשר גם לאחזר את טוקן ה-OAuth של ספק GitHub, שבו אפשר להשתמש כדי לאחזר נתונים נוספים באמצעות ממשקי ה-API של GitHub.

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

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

      Web

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

      Web

      firebase.auth().signInWithRedirect(provider);
      אחרי כן, תוכלו גם לאחזר את אסימון ה-OAuth של ספק GitHub על ידי קריאה ל-getRedirectResult כשהדף נטען:

      Web

      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

      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;
          // ...
        });
      כאן גם אפשר לזהות ולטפל בשגיאות. רשימה של קודי שגיאה זמינה במסמכי העזר בנושא אימות.

טיפול בתהליך הכניסה באופן ידני

אפשר גם לבצע אימות ב-Firebase באמצעות חשבון GitHub על ידי טיפול בתהליך הכניסה באמצעות קריאה לנקודות הקצה של GitHub OAuth 2.0:

  1. משלבים את האימות של GitHub באפליקציה לפי התיעוד למפתחים. בסוף תהליך הכניסה ל-GitHub, תקבלו אסימון גישה מסוג OAuth 2.0.
  2. אם אתם צריכים להיכנס לאפליקציית Node.js, שולחים את אסימון הגישה של OAuth לאפליקציית Node.js.
  3. אחרי שהמשתמש מתחבר בהצלחה באמצעות GitHub, מחליפים את אסימון הגישה מסוג OAuth 2.0 בפרטי כניסה ל-Firebase:

    Web

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

    Web

    var credential = firebase.auth.GithubAuthProvider.credential(token);
  4. מבצעים אימות באמצעות Firebase באמצעות פרטי הכניסה של Firebase:

    Web

    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

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

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

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

השלבים הבאים

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

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

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

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

כדי להוציא משתמש מהחשבון, מתקשרים אל signOut:

Web

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

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

Web

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