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

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

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

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

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

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

    כניסה לחשבון Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    Facebook Login
    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 של המשתמש המחובר:

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

פתרון בעיות

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