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

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

قبل البدء

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

الانضمام إلى برنامج Apple Developer

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

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

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

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

  1. في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
  2. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر تسجيل الدخول Apple.
  3. اضبط إعدادات موفّر خدمة Apple Sign In:
    • Apple: إذا كنت ستنشر تطبيقك على منصات Apple فقط، يمكنك ترك حقول معرّف الخدمة ومعرّف فريق Apple والمفتاح الخاص ومعرّف المفتاح فارغة.
    • Android: أكمل الخطوات التالية لتوفير الدعم لأجهزة Android:
      1. أضِف Firebase إلى مشروع Android.
      2. حدِّد بصمة SHA-1 لتطبيقك إذا لم يسبق لك إجراء ذلك.
        1. في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب الإعدادات العامة ضمن الإعدادات.
        2. انتقِل للأسفل إلى بطاقة تطبيقاتك، واختَر تطبيق Android، وأضِف بصمة SHA-1 في حقل بصمات شهادة SHA.

        راجِع مقالة مصادقة تطبيقك للحصول على تفاصيل حول كيفية الحصول على الملف المرجعي SHA لتطبيقك.

      3. اضبط إعدادات موفّر خدمة "تسجيل الدخول باستخدام Apple":
        1. في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
        2. في علامة التبويب طريقة تسجيل الدخول، انقر على موفِّر خدمة تسجيل الدخول Apple.
        3. حدِّد معرّف الخدمة الذي أنشأته في القسم السابق. في قسم إعدادات مسار رموز 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، مثل حزمة Unity لتخزين مواد العرض الخاصة بميزة "تسجيل الدخول باستخدام Apple". قد تحتاج إلى تعديل الرمز البرمجي لتضمين سلسلة الأرقام العشوائية التي تم إنشاؤها في حالتها الأولية لاستخدامها في عمليات Firebase (أي تخزين نسخة منها قبل إنشاء نموذج التجزئة SHA256 للأرقام العشوائية).

  2. استخدِم سلسلة الرمز المميز ورمز الاستخدام لإنشاء Firebase Credential وتسجيل الدخول إلى 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. يمكنك الاطّلاع على مستندات &quot;تسجيل الدخول باستخدام Apple&quot; لمعرفة اللغات المتوافقة.

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

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

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

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

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

الخطوات التالية

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

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

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