קישור של כמה ספקי אימות לחשבון ב-Unity

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

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

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

המחלקה FirebaseAuth היא השער לכל הקריאות ל-API. אפשר לגשת אליו דרך FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

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

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

    כניסה באמצעות חשבון Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    כניסה באמצעות חשבון Facebook
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    כניסה באמצעות סיסמה לאימייל
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
  4. מעבירים את האובייקט Firebase.Auth.Credential אל המשתמש המחובר LinkWithCredentialAsync method:

    auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("LinkWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

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

    // Gather data for the currently signed in User.
    string currentUserId = auth.CurrentUser.UserId;
    string currentEmail = auth.CurrentUser.Email;
    string currentDisplayName = auth.CurrentUser.DisplayName;
    System.Uri currentPhotoUrl = auth.CurrentUser.PhotoUrl;
    
    // Sign in with the new credentials.
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });

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

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

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

// Unlink the sign-in provider from the currently active user.
// providerIdString is a string identifying a provider,
// retrieved via FirebaseAuth.FetchProvidersForEmail().
auth.CurrentUser.UnlinkAsync(providerIdString).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("UnlinkAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("UnlinkAsync encountered an error: " + task.Exception);
    return;
  }

  // The user has been unlinked from the provider.
  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});