المصادقة باستخدام Apple وUnity

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام معرّف Apple الخاص بهم، وذلك من خلال استخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase لتسجيل الدخول من خلال بروتوكول OAuth 2.0 الشامل.

قبل البدء

لتسجيل دخول المستخدمين باستخدام Apple، يجب أولاً ضبط ميزة "تسجيل الدخول باستخدام حساب Apple" على الموقع الإلكتروني للمطوّرين من Apple، ثم تفعيل Apple باعتبارها مقدّم خدمة تسجيل الدخول لمشروعك على Firebase.

الانضمام إلى برنامج مطوّري برامج Apple

لا يمكن إعداد ميزة "تسجيل الدخول باستخدام حساب Apple" إلّا من خلال أعضاء برنامج مطوّري Apple.

ضبط ميزة "تسجيل الدخول باستخدام حساب Apple"

يجب تفعيل ميزة "تسجيل الدخول إلى Apple" وضبطها بشكل صحيح في مشروع Firebase. تختلف إعدادات مطوّر البرامج Apple باختلاف النظامين الأساسيين Android وApple. يُرجى اتّباع قسم "ضبط تسجيل الدخول باستخدام جهاز Apple" في الدليل +iOS و/أو Android قبل المتابعة.

تفعيل Apple كموفِّر لتسجيل الدخول

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر خدمة Apple.
  2. اضبط إعدادات موفّر خدمة "تسجيل الدخول إلى Apple":
    1. إذا كنت تنشر تطبيقك على أنظمة Apple الأساسية فقط، يمكنك ترك حقول معرّف الخدمة ومعرّف فريق Apple والمفتاح الخاص ورقم تعريف المفتاح فارغة.
    2. للحصول على الدعم على أجهزة Android:
      1. أضِف Firebase إلى مشروع Android. احرص على تسجيل توقيع SHA-1 لتطبيقك عند إعداد تطبيقك في وحدة تحكُّم Firebase.
      2. في وحدة تحكُّم Firebase، افتح قسم المصادقة. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر خدمة Apple. حدِّد معرّف الخدمة الذي أنشأته في القسم السابق. بالإضافة إلى ذلك، في قسم إعداد مسار رمز OAuth، حدِّد رقم تعريف فريق Apple والمفتاح الخاص ورقم تعريف المفتاح اللذين أنشأتهما في القسم السابق.

الالتزام بمتطلبات البيانات المخفية الهوية من Apple

تتيح ميزة "تسجيل الدخول باستخدام حساب Apple" للمستخدمين خيار إخفاء هوية بياناتهم، بما في ذلك عناوين بريدهم الإلكتروني، عند تسجيل الدخول. المستخدمون الذين يحددون هذا الخيار لديهم عناوين بريد إلكتروني بالنطاق privaterelay.appleid.com. عند استخدام ميزة "تسجيل الدخول باستخدام حساب Apple" في تطبيقك، عليك الالتزام بأيّ سياسات سارية للمطوّرين أو بنود من Apple في ما يتعلّق بمعرّفات Apple المجهولة الهوية هذه.

ويشمل ذلك الحصول على أي موافقة مطلوبة من المستخدم قبل ربط أي معلومات شخصية تحدّد الهوية بشكل مباشر بمعرّف Apple مخفي الهوية. عند استخدام مصادقة Firebase، قد يتضمن ذلك الإجراءات التالية:

  • ربط عنوان بريد إلكتروني بمعرّف Apple مجهول الهوية أو العكس بالعكس.
  • ربط رقم هاتف بمعرّف Apple مجهول الهوية أو العكس
  • ربط بيانات اعتماد غير مجهولة الهوية على وسائل التواصل الاجتماعي (Facebook أو Google وغير ذلك) بحساب Apple مجهول الهوية أو العكس

إنّ القائمة أعلاه ليست شاملة. يُرجى الرجوع إلى "اتفاقية ترخيص برنامج مطوّري البرامج من Apple" في قسم "الاشتراك" في حساب المطوِّر للتأكّد من أنّ تطبيقك يستوفي متطلبات Apple.

الوصول إلى الصف Firebase.Auth.FirebaseAuth

الفئة FirebaseAuth هي مدخل جميع طلبات البيانات من واجهة برمجة التطبيقات. ويمكن الوصول إليه من خلال FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

معالجة عملية تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase

تختلف عملية تسجيل الدخول باستخدام حساب Apple باختلاف أنظمة Apple وAndroid الأساسية.

على منصات Apple

  1. يمكنك تثبيت مكوّن إضافي تابع لجهة خارجية لمعالجة رقم تسجيل الدخول إلى Apple وإنشاء رمز مميّز، مثل حزمة تسجيل الدخول باستخدام Apple Asset Storage في Unity. قد تحتاج إلى تغيير الرمز لربط السلسلة nonce العشوائية التي تم إنشاؤها في حالة السلسلة الأولية لاستخدامها في عمليات Firebase (أي تخزين نسخة منها قبل إنشاء شكل ملخص SHA256 الخاص بالأمر غير المحدد).

  2. استخدِم سلسلة الرمز المميّز الناتجة والنص الأولي لإنشاء بيانات اعتماد Firebase وتسجيل الدخول إلى Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    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);
    });
    

  3. يمكن استخدام النمط نفسه مع ReauthenticateAsync الذي يمكن استخدامه لاسترداد بيانات الاعتماد الجديدة للعمليات الحساسة التي تتطلب تسجيل دخول حديث. لمزيد من المعلومات، يُرجى الاطّلاع على إدارة المستخدمين.

  4. عند الربط بميزة تسجيل الدخول من Apple على منصات Apple، قد تواجه خطأً تفيد بأن حسابًا حاليًا على Firebase قد تم ربطه بحساب Apple. وفي هذه الحالة، سيتم طرح Firebase.Auth.FirebaseAccountLinkException بدلاً من القيمة Firebase.FirebaseException العادية. في هذه الحالة، يشمل الاستثناء السمة UserInfo.UpdatedCredential التي يمكن استخدامها، إذا كانت صالحة، لتسجيل الدخول إلى حساب المستخدم المرتبط بحساب Apple من خلال FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. إنّ بيانات الاعتماد المعدَّلة تتحايل على الحاجة إلى إنشاء رمز مميّز جديد لتسجيل الدخول إلى Apple برقم غير محدّد لعملية تسجيل الدخول.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

على Android

على Android، يمكنك المصادقة على المستخدمين في Firebase من خلال دمج تسجيل الدخول عبر بروتوكول OAuth المستند إلى الويب في تطبيقك باستخدام حزمة SDK لمنصة Firebase لتسجيل الدخول من البداية إلى النهاية.

لمعالجة عملية تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase، اتّبِع الخطوات التالية:

  1. ويمكنك إنشاء مثيل لـ FederatedOAuthProviderData تم ضبطه باستخدام رقم تعريف الموفّر المناسب لشركة Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. اختياري: حدِّد نطاقات OAuth 2.0 الإضافية غير التلقائية التي تريد طلبها من موفِّر المصادقة.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. اختياري: إذا كنت تريد عرض شاشة تسجيل الدخول في Apple بلغة غير الإنجليزية، اضبط المَعلمة locale. راجِع مستندات "تسجيل الدخول باستخدام حساب Apple" للاطّلاع على اللغات المتاحة.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. بعد ضبط بيانات موفّر الخدمة، يمكنك استخدامها لإنشاء Federated OAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. يمكنك المصادقة مع Firebase باستخدام عنصر موفّر المصادقة. تجدر الإشارة إلى أنّه على عكس عمليات FirebaseAuth الأخرى، سيتحكّم هذا الإجراء في واجهة المستخدم من خلال ظهور طريقة عرض ويب يستطيع المستخدم من خلالها إدخال بيانات الاعتماد.

    لبدء عملية تسجيل الدخول، يمكنك الاتصال بالرقم signInWithProvider:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. يمكن استخدام النمط نفسه مع ReauthenticateWithProvider الذي يمكن استخدامه لاسترداد بيانات الاعتماد الجديدة للعمليات الحساسة التي تتطلب تسجيل دخول حديث.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. ويمكنك استخدام LinkWithCredentialAsync() لربط موفِّري هوية مختلفين بالحسابات الحالية.

    ملاحظة: تشترط Apple الحصول على موافقة صريحة من المستخدمين قبل ربط حساباتهم على Apple ببيانات أخرى.

    على سبيل المثال، لربط حساب Facebook بحساب Firebase الحالي، استخدِم رمز الدخول الذي حصلت عليه من تسجيل دخول المستخدم إلى Facebook:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( 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;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

تسجيل الدخول باستخدام Apple Notes

لا توفّر Apple عنوان URL للصورة، على عكس مقدّمي الخدمة الآخرين المعتمَدين من خلال مصادقة Firebase.

بالإضافة إلى ذلك، عندما يختار المستخدم عدم مشاركة عنوان بريده الإلكتروني مع التطبيق، ستوفّر Apple عنوان بريد إلكتروني فريدًا لهذا المستخدم (من النموذج xyz@privaterelay.appleid.com) يشاركه مع التطبيق. وإذا ضبطت خدمة ترحيل البريد الإلكتروني الخاص، تعيد Apple توجيه الرسائل الإلكترونية المُرسَلة إلى العنوان المجهول الهوية إلى عنوان البريد الإلكتروني الحقيقي للمستخدم.

لا تشارك Apple معلومات المستخدم إلا مع التطبيقات، مثل الاسم المعروض، في المرة الأولى التي يسجّل فيها المستخدم الدخول. يخزّن Firebase عادةً الاسم المعروض في المرة الأولى التي يسجّل فيها المستخدم الدخول إلى Apple، وهو ما يمكنك الحصول عليه من خلال auth.CurrentUser.DisplayName. ومع ذلك، إذا سبق لك استخدام Apple لتسجيل دخول مستخدم إلى التطبيق بدون استخدام Firebase، لن توفّر Apple الاسم المعروض للمستخدم لمنصة Firebase.

الخطوات اللاحقة

بعد تسجيل دخول المستخدم للمرة الأولى، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد، أي اسم المستخدم وكلمة المرور، أو رقم الهاتف، أو معلومات مقدم خدمة المصادقة - المستخدم الذي سجّل الدخول باستخدامه. يتم تخزين هذا الحساب الجديد كجزء من مشروعك في Firebase، ويمكن استخدامه لتحديد هوية مستخدم في كل تطبيق في مشروعك، بغض النظر عن كيفية تسجيل المستخدم للدخول.

يمكنك الحصول في تطبيقاتك على معلومات الملف الشخصي الأساسية للمستخدم من كائن Firebase.Auth.FirebaseUser. راجع إدارة المستخدمين.

في قاعدة بيانات Firebase في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغير المصادقة، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.