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

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

قبل البدء

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

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

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

ضبط ميزة "تسجيل الدخول باستخدام حساب 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" (تسجيل الدخول باستخدام Apple Asset Storage) الحزمة. قد تحتاج إلى تغيير الرمز لربط السلسلة nonce العشوائية التي تم إنشاؤها في حالة السلسلة الأولية لاستخدامها في عمليات Firebase (أي تخزين نسخة من قبل إنشاء نموذج ملخص SHA256 الخاص بـ nonce).

  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. مع nonce لعملية تسجيل الدخول.

    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. بعد ضبط بيانات مزوِّد الخدمة، يمكنك استخدامها لإنشاء 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

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

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

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

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

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

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

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