ربط عدة مقدّمي خدمات مصادقة بحساب في Unity

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام عدة موفِّري مصادقة من خلال ربط بيانات اعتماد موفِّر المصادقة بحساب مستخدم حالي. ويمكن التعرّف على المستخدمين من خلال رقم تعريف مستخدم Firebase نفسه بغض النظر عن موفِّر المصادقة الذي تم استخدامه لتسجيل الدخول. على سبيل المثال، يمكن للمستخدم الذي سجّل الدخول باستخدام كلمة مرور ربط حساب Google وتسجيل الدخول بأي من الطريقتين في المستقبل. أو يمكن للمستخدم المجهول ربط حساب Facebook ثم تسجيل الدخول لاحقًا باستخدام Facebook لمتابعة استخدام التطبيق.

قبل البدء

أضِف إلى تطبيقك دعمًا لاثنين أو أكثر من مزوّدي خدمات المصادقة (ربما يشمل ذلك المصادقة المجهولة).

الفئة FirebaseAuth هي مدخل جميع طلبات البيانات من واجهة برمجة التطبيقات. ويمكن الوصول إليه من خلال 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);
    
    تسجيل الدخول باستخدام عنوان البريد الإلكتروني (Email-password)
    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 نفسها.

يمكنك إلغاء ربط موفِّر مصادقة بحساب، حتى لا يتمكّن المستخدم من تسجيل الدخول من خلال ذلك الحساب مرة أخرى.

لإلغاء ربط موفِّر مصادقة بحساب مستخدم، أرسِل رقم تعريف مقدِّم الخدمة إلى الطريقة 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);
});