پیوند دادن چندین ارائه‌دهنده اصالت‌سنجی به یک حساب در 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 کاربر واردشده به سیستم ارسال کنید:

    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 دسترسی پیدا کند.

یک حساب کاربری Firebase می‌تواند چندین ارائه‌دهنده اصالت‌سنجی پیوندشده داشته باشد (برای مثال، ایمیل/گذرواژه، Google،‏ Facebook)، که به کاربر امکان می‌دهد ازطریق روش‌های مختلف به همان حساب 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);
});

عیب‌یابی

اگر هنگام تلاش برای پیوند دادن چند حساب با خطا مواجه شدید، مستندات مربوط به نشانی‌های ایمیل تأییدشده را ببینید.