אימות עם Firebase באמצעות מערכת אימות מותאמת אישית ו-C++

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

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

  1. איך מוסיפים את Firebase לפרויקט C++‎
  2. משיגים את מפתחות השרת של הפרויקט:
    1. במסוף Firebase, עוברים אל Settings > הכרטיסייה Service accounts.
    2. בחלק התחתון של הקטע SDK של Firebase לאדמינים, לוחצים על Generate New Private Key (יצירת מפתח פרטי חדש).
    3. זוג המפתחות הציבורי/פרטי של חשבון השירות החדש נשמר אוטומטית במחשב. מעתיקים את הקובץ הזה לשרת האימות.

אימות באמצעות Firebase

המחלקות Auth הן שער לכל הקריאות ל-API.
  1. מוסיפים את קובצי הכותרות Auth ו-App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. יוצרים מחלקה firebase::App בקוד האתחול.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. קבלת הכיתה firebase::auth::Auth ל-firebase::App. יש מיפוי של אחד לאחד בין App לבין Auth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
מתקשרים אל Auth::SignInWithCustomToken עם הטוקן משרת האימות.
  1. כשמשתמשים נכנסים לאפליקציה שלכם, צריך לשלוח את פרטי הכניסה שלהם (למשל, שם המשתמש והסיסמה) לשרת האימות שלכם. השרת בודק את פרטי הכניסה ומחזיר אסימון בהתאמה אישית אם הם תקפים.
  2. אחרי שמקבלים את האסימון המותאם אישית משרת האימות, מעבירים אותו אל Auth::SignInWithCustomToken כדי שהמשתמש יוכל להיכנס:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomToken(custom_token);
  3. אם התוכנית שלכם כוללת לולאת עדכון שפועלת באופן קבוע (למשל 30 או 60 פעמים בשנייה), תוכלו לבדוק את התוצאות פעם אחת בכל עדכון באמצעות Auth::SignInWithCustomTokenLastResult:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomTokenLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    לחלופין, אם התוכנית שלכם מבוססת על אירועים, יכול להיות שתעדיפו לרשום קריאה חוזרת ב-Future.

השלבים הבאים

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

  • באפליקציות, אפשר לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט firebase::auth::User:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
  • ב-Firebase Realtime Database וב-Cloud Storage Security Rules, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים משתמש יכול לגשת.

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

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

auth->SignOut();