בצע אימות עם Firebase באמצעות חשבונות מבוססי סיסמה באמצעות C++

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

לפני שאתה מתחיל

  1. הוסף את Firebase לפרויקט C++ שלך .
  2. אם עדיין לא חיברת את האפליקציה שלך לפרויקט Firebase שלך, עשה זאת ממסוף Firebase .
  3. אפשר כניסה לאימייל/סיסמה:
    1. במסוף Firebase , פתח את הקטע Auth .
    2. בכרטיסייה שיטת כניסה , הפעל את שיטת הכניסה לדוא"ל/סיסמה ולחץ על שמור .

גש למחלקת firebase::auth::Auth

מחלקת Auth היא השער לכל קריאות ה-API.
  1. הוסף את קובצי ה-Auth ו-App header:
    #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);
    

צור חשבון מבוסס סיסמה

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

  1. כאשר משתמש חדש נרשם באמצעות טופס ההרשמה של האפליקציה שלך, השלם את כל שלבי אימות החשבון החדשים שהאפליקציה שלך דורשת, כגון אימות שהסיסמה של החשבון החדש הוקלדה כהלכה ועומדת בדרישות המורכבות שלך.
  2. צור חשבון חדש על ידי העברת כתובת הדוא"ל והסיסמה של המשתמש החדש אל Auth::CreateUserWithEmailAndPassword :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->CreateUserWithEmailAndPassword(email, password);
    
  3. אם לתוכנית שלך יש לולאת עדכון שפועלת באופן קבוע (נניח 30 או 60 פעמים בשנייה), אתה יכול לבדוק את התוצאות פעם אחת בכל עדכון עם Auth::CreateUserWithEmailAndPasswordLastResult :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->CreateUserWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        const 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());
      }
    }
    
    או, אם התוכנית שלך מונעת על ידי אירועים, אולי תעדיף כדי לרשום התקשרות חוזרת על העתיד .

היכנס למשתמש עם כתובת דוא"ל וסיסמה

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

  1. כאשר משתמש נכנס לאפליקציה שלך, העביר את כתובת הדוא"ל והסיסמה של המשתמש ל- firebase::auth::Auth::SignInWithEmailAndPassword :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithEmailAndPassword(email, password);
    
  2. אם לתוכנית שלך יש לולאת עדכון שפועלת באופן קבוע (נניח 30 או 60 פעמים בשנייה), אתה יכול לבדוק את התוצאות פעם אחת בכל עדכון עם Auth::SignInWithEmailAndPasswordLastResult :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        const firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for email %s\n",
               auth_result.user.email().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    
    או, אם התוכנית שלך מונעת על ידי אירועים, אולי תעדיף כדי לרשום התקשרות חוזרת על העתיד .

רשום התקשרות חוזרת על עתיד

לחלק מהתוכניות יש פונקציות Update שנקראות 30 או 60 פעמים בשנייה. לדוגמה, משחקים רבים עוקבים אחר המודל הזה. תוכניות אלה יכולות לקרוא לפונקציות LastResult כדי לסקר שיחות אסינכרוניות. עם זאת, אם התוכנית שלך מונעת מאירועים, ייתכן שתעדיף לרשום פונקציות התקשרות חוזרת. פונקציית התקשרות חוזרת נקראת עם השלמת העתיד.
void OnCreateCallback(const firebase::Future<firebase::auth::User*>& result,
                      void* user_data) {
  // The callback is called when the Future enters the `complete` state.
  assert(result.status() == firebase::kFutureStatusComplete);

  // Use `user_data` to pass-in program context, if you like.
  MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data);

  // Important to handle both success and failure situations.
  if (result.error() == firebase::auth::kAuthErrorNone) {
    firebase::auth::User* user = *result.result();
    printf("Create user succeeded for email %s\n", user->email().c_str());

    // Perform other actions on User, if you like.
    firebase::auth::User::UserProfile profile;
    profile.display_name = program_context->display_name;
    user->UpdateUserProfile(profile);

  } else {
    printf("Created user failed with error '%s'\n", result.error_message());
  }
}

void CreateUser(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  firebase::Future<firebase::auth::AuthResult> result =
      auth->CreateUserWithEmailAndPasswordLastResult();

  // `&my_program_context` is passed verbatim to OnCreateCallback().
  result.OnCompletion(OnCreateCallback, &my_program_context);
}
פונקציית ההתקשרות חזרה יכולה להיות גם למבדה, אם אתה מעדיף.
void CreateUserUsingLambda(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  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::User*>& 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 שלוקחות כתובות דוא"ל כפרמטרים גוררות שגיאות ספציפיות אם כתובת הדוא"ל אינה רשומה כאשר היא חייבת להירשם (לדוגמה, בעת כניסה עם כתובת דוא"ל וסיסמה), או נרשמה כאשר היא חייבת להיות ללא שימוש (לדוגמה, בעת שינוי כתובת דוא"ל של משתמש). למרות שזה יכול להיות מועיל להצעת תרופות ספציפיות למשתמשים, זה יכול גם להיות מנוצל לרעה על ידי שחקנים זדוניים כדי לגלות את כתובות האימייל שנרשמו על ידי המשתמשים שלך.

כדי להפחית את הסיכון הזה, אנו ממליצים להפעיל הגנה על ספירת דוא"ל עבור הפרויקט שלך באמצעות הכלי Google Cloud gcloud . שים לב שהפעלת תכונה זו משנה את התנהגות דיווח השגיאות של Firebase Authentication: ודא שהאפליקציה שלך לא מסתמכת על השגיאות הספציפיות יותר.

הצעדים הבאים

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

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

    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 ואחסון בענן , תוכל לקבל את מזהה המשתמש הייחודי של המשתמש המחובר ממשתנה auth , ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.

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

כדי לצאת ממשתמש, התקשר ל- SignOut() :

auth->SignOut();