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

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

قبل ان تبدأ

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

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

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

تكوين تسجيل الدخول مع Apple

يجب تمكين تسجيل الدخول إلى Apple وتهيئته بشكل صحيح في مشروع Firebase الخاص بك. يختلف تكوين Apple Developer عبر منصات 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 Developer في قسم العضوية في حساب المطور الخاص بك للتأكد من أن تطبيقك يلبي متطلبات Apple.

قم بالوصول إلى فئة Firebase.Auth.FirebaseAuth

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

تعامل مع تدفق تسجيل الدخول باستخدام Firebase SDK

تختلف عملية تسجيل الدخول باستخدام Apple عبر منصات Apple وAndroid.

على منصات أبل

  1. قم بتثبيت مكون إضافي لجهة خارجية للتعامل مع تسجيل الدخول عبر Apple وإنشاء الرمز المميز، مثل حزمة Unity's Sign In With Apple Asset Storage Package . قد تحتاج إلى تغيير التعليمات البرمجية لتوصيل سلسلة 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 Sign In على منصات 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، قم بمصادقة المستخدمين لديك باستخدام Firebase من خلال دمج تسجيل دخول OAuth العام المستند إلى الويب في تطبيقك باستخدام Firebase SDK لتنفيذ تدفق تسجيل الدخول الشامل.

للتعامل مع تدفق تسجيل الدخول باستخدام Firebase SDK، اتبع الخطوات التالية:

  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. بمجرد تكوين بيانات المزود الخاص بك، استخدمها لإنشاء 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);
        });
    

تسجيل الدخول باستخدام ملاحظات أبل

على عكس مقدمي الخدمات الآخرين الذين تدعمهم 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 Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير المصادقة، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.