תחילת העבודה עם אימות ב-Firebase ב-C++

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

קישור פרויקט C++‎ ל-Firebase

לפני שמשתמשים Firebase Authentication, צריך:

  • רושמים את פרויקט C++ ומגדירים אותו לשימוש ב-Firebase.

    אם הפרויקט שלכם ב-C++ כבר משתמש ב-Firebase, הוא כבר רשום שהוגדר ל-Firebase.

  • מוסיפים את Firebase C++ SDK לפרויקט ב-C++.

חשוב לזכור שהוספת Firebase לפרויקט C++‎ כוללת משימות גם במסוף Firebase וגם בפרויקט הפתוח ב-C++‎ (לדוגמה, מורידים קובצי תצורה של Firebase מהמסוף ומעבירים אותם לפרויקט ב-C++‎).

הרשמה של משתמשים חדשים

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

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPassword(email, password);

אפשר לבדוק את הסטטוס של פעולת יצירת החשבון על ידי רישום קריאה חוזרת (callback) באובייקט ה-Future‏ CreateUserWithEmailAndPasswordLastResult, או, אם כותבים משחק או אפליקציה עם סוג כלשהו של לולאת עדכון תקופתית, על ידי בדיקת הסטטוס בלולאת העדכון.

לדוגמה, שימוש ב'עתיד':

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPasswordLastResult();

// The lambda has the same signature as the callback function.
result.OnCompletion(
    [](const firebase::Future<firebase::auth::AuthResult>& result,
       void* user_data) {
      // `user_data` is the same as &my_program_context, below.
      // Note that we can't capture this value in the [] because std::function
      // is not supported by our minimum compiler spec (which is pre C++11).
      MyProgramContext* program_context =
          static_cast<MyProgramContext*>(user_data);

      // Process create user result...
      (void)program_context;
    },
    &my_program_context);

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

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPasswordLastResult();
if (result.status() == firebase::kFutureStatusComplete) {
  if (result.error() == firebase::auth::kAuthErrorNone) {
    firebase::auth::AuthResult* auth_result = *result.result();
    printf("Create user succeeded for email %s\n", auth_result.user.email().c_str());
  } else {
    printf("Created user failed with error '%s'\n", result.error_message());
  }
}

כניסה של משתמשים קיימים

יוצרים טופס שמאפשר למשתמשים קיימים להיכנס באמצעות כתובת האימייל והסיסמה שלהם. כשמשתמש ממלא את הטופס, צריך להפעיל את השיטה SignInWithEmailAndPassword:

firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithEmailAndPassword(email, password);

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

הגדרת מאזין למצב האימות וקבלת נתוני החשבון

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

יצירת ה-listener על ידי הטמעה של firebase::auth::AuthStateListener שיעור מופשט. לדוגמה, כדי ליצור מאזין שמקבל מידע על המשתמש כשהמשתמש נכנס לחשבון:

class MyAuthStateListener : public firebase::auth::AuthStateListener {
 public:
  void OnAuthStateChanged(firebase::auth::Auth* auth) override {
    firebase::auth::User user = auth.current_user();
    if (user.is_valid()) {
      // User is signed in
      printf("OnAuthStateChanged: signed_in %s\n", user.uid().c_str());
      const std::string displayName = user.DisplayName();
      const std::string emailAddress = user.Email();
      const std::string photoUrl = user.PhotoUrl();
    } else {
      // User is signed out
      printf("OnAuthStateChanged: signed_out\n");
    }
    // ...
  }
};

מחברים את ה-listener עם האובייקט firebase::auth::Auth AddAuthStateListener method:

MyAuthStateListener state_change_listener;
auth->AddAuthStateListener(&state_change_listener);

השלבים הבאים

כאן מוסבר איך מוסיפים תמיכה בספקי זהויות אחרים ובחשבונות אורחים אנונימיים: