קישור של מספר ספקי אימות לחשבון באמצעות C++

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

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

הוספת תמיכה לשני ספקי אימות או יותר (כולל תמיכה) לאימות אנונימי) באפליקציה.

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

  1. מזינים את פרטי הכניסה של המשתמש באמצעות כל ספק או שיטה של אימות.
  2. משלימים את תהליך הכניסה של ספק האימות החדש, עד להפעלה של אחת מהשיטות firebase::auth::Auth::SignInWithCredential, אבל לא כולל אותה. לדוגמה, אפשר לקבל אסימון מזהה Google, אסימון הגישה ל-Facebook, כתובת האימייל והסיסמה של המשתמש.
  3. קבלת firebase::auth::Credential לספק האימות החדש:

    כניסה באמצעות חשבון Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    התחברות ל-Facebook
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    כניסה באמצעות סיסמה לאימייל
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
  4. מעבירים את האובייקט firebase::auth::Credential אל המשתמש המחובר LinkWithCredential method:

    // Link the new credential to the currently active user.
    firebase::auth::User current_user = auth->current_user();
    firebase::Future<firebase::auth::AuthResult> result =
        current_user.LinkWithCredential(credential);

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

    // Gather data for the currently signed in User.
    firebase::auth::User current_user = auth->current_user();
    std::string current_email = current_user.email();
    std::string current_provider_id = current_user.provider_id();
    std::string current_display_name = current_user.display_name();
    std::string current_photo_url = current_user.photo_url();
    
    // Sign in with the new credentials.
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // The new User is now active.
    if (result.error() == firebase::auth::kAuthErrorNone) {
      firebase::auth::User* new_user = *result.result();
    
      // Merge new_user with the user in details.
      // ...
      (void)new_user;
    }

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

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

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

// Unlink the sign-in provider from the currently active user.
firebase::auth::User current_user = auth->current_user();
firebase::Future<firebase::auth::AuthResult> result =
    current_user.Unlink(providerId);