المصادقة مع Firebase باستخدام رقم هاتف مع Unity

يمكنك استخدام مصادقة Firebase لتسجيل دخول المستخدم عن طريق إرسال رسالة قصيرة SMS إلى هاتف المستخدم. يسجِّل المستخدم الدخول باستخدام رمز يُستخدم لمرة واحدة ضمن الرسالة القصيرة SMS.

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

قبل البدء

  1. لكي تتمكّن من استخدام مصادقة Firebase، يجب إضافة حزمة تطوير البرامج (SDK) Unity من Firebase (على وجه التحديد FirebaseAuth.unitypackage) إلى مشروعك على Unity.

    يمكنك العثور على تعليمات مفصَّلة لخطوات الإعداد الأولية هذه في إضافة Firebase إلى مشروع Unity.

  2. إذا لم تكن قد ربطت تطبيقك بمشروعك في Firebase، يمكنك إجراء ذلك من خلال وحدة تحكُّم Firebase.
  3. تعرَّف على متطلبات النظام الأساسي لتسجيل الدخول باستخدام رقم الهاتف:
    • لا تتوفّر إمكانية تسجيل الدخول باستخدام رقم الهاتف إلا على الأنظمة الأساسية للأجهزة الجوّالة.
    • على أجهزة iOS، يتطلّب تسجيل الدخول باستخدام رقم الهاتف استخدام جهاز فعلي ولن يتم استخدام المحاكي.

المخاوف المرتبطة بالأمان

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

إذا كنت تستخدم نظام تسجيل الدخول عبر رقم الهاتف في تطبيقك، عليك توفيره إلى جانب طرق أكثر أمانًا لتسجيل الدخول، وإعلام المستخدمين بالمقايضات الأمنية لتسجيل الدخول باستخدام رقم الهاتف.

تفعيل ميزة "تسجيل الدخول باستخدام رقم الهاتف" لمشروع Firebase

لتسجيل دخول المستخدمين عبر الرسائل القصيرة SMS، يجب أولاً تفعيل طريقة تسجيل الدخول باستخدام رقم الهاتف لمشروع Firebase:

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  2. في صفحة طريقة تسجيل الدخول، فعِّل طريقة تسجيل الدخول رقم الهاتف.

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

بدء تلقّي إشعارات أسماء نقاط الوصول (APN) (على أجهزة iOS فقط)

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

لتفعيل إشعارات أسماء نقاط الوصول (APN) للاستخدام مع مصادقة Firebase:

  1. في Xcode، يمكنك تفعيل الإشعارات الفورية لمشروعك.
  2. حمِّل شهادة أسماء نقاط الوصول إلى Firebase. إذا لم يكن لديك شهادة أسماء نقاط الوصول (APN) من قبل، احرص على إنشاء شهادة في مركز أعضاء المطوّرين في Apple.

    1. من داخل مشروعك في وحدة تحكُّم Firebase، اختَر رمز الترس، ثمّ اختَر إعدادات المشروع (Project Settings)، ثم اختَر علامة التبويب المراسلة عبر السحابة الإلكترونية.

    2. انقر على الزر تحميل شهادة لشهادة التطوير أو شهادة الإنتاج أو كليهما. ويجب إدراج لقطة شاشة واحدة على الأقل.

    3. اختَر ملف .p12 لكل شهادة وأدخِل كلمة المرور، إن توفّرت. تأكَّد من أنّ رقم تعريف الحزمة لهذه الشهادة يتطابق مع رقم تعريف حزمة تطبيقك. انقر على حفظ.

إرسال رمز تحقُّق إلى هاتف المستخدم

لبدء تسجيل الدخول إلى رقم الهاتف، قدِّم للمستخدم واجهة تطلب منه تقديم رقم هاتفه، ثم اتصِل بالرقم PhoneAuthProvider.VerifyPhoneNumber لتطلب من Firebase إرسال رمز مصادقة إلى هاتف المستخدم من خلال رسالة SMS:

  1. الحصول على رقم هاتف المستخدم

    تختلف المتطلبات القانونية، ولكن وفقًا لأفضل الممارسات ولتحديد التوقعات للمستخدمين، يجب إبلاغهم بأنّه في حال تسجيل الدخول عبر الهاتف، قد يتلقّون رسالة قصيرة (SMS) لإثبات الملكية وسيتم تطبيق الأسعار العادية.

  2. يمكنك طلب PhoneAuthProvider.VerifyPhoneNumber، وتمرير رقم PhoneAuthOptions الذي يحتوي على رقم هاتف المستخدم إليه.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) => {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    
    عند الاتصال بـ PhoneAuthProvider.VerifyPhoneNumber أو Firebase،
    • (على iOS)، يرسل إشعارًا فوريًا صامتًا إلى تطبيقك.
    • يرسل Firebase رسالة قصيرة SMS تحتوي على رمز مصادقة إلى رقم الهاتف المحدد وتمرر رقم تعريف التحقق إلى وظيفة الإكمال. ستحتاج إلى كلٍّ من رمز التحقّق ورقم تعريف إثبات الهوية لتسجيل دخول المستخدم.
  3. احفظ رقم تعريف إثبات الهوية واستعادته عند تحميل تطبيقك. ومن خلال إجراء ذلك، يمكنك التأكّد من أنّه ما زال لديك رقم تعريف صالح لإثبات الهوية في حال تم إغلاق تطبيقك قبل أن يكمل المستخدم عملية تسجيل الدخول (على سبيل المثال، أثناء التبديل إلى تطبيق SMS).

    يمكنك الاحتفاظ بمعرّف إثبات الملكية بالطريقة التي تريدها. هناك طريقة بسيطة وهي حفظ معرّف إثبات الملكية باستخدام UnityEngine.PlayerPrefs.

إذا تم استدعاء معاودة الاتصال التي تم تمريرها إلى codeSent، يمكنك أن تطلب من المستخدم كتابة رمز التحقق عند استلامه في الرسالة القصيرة.

من ناحية أخرى، إذا تم استدعاء إحدى استدعاءات verificationCompleted، فهذا يعني أن التحقق التلقائي قد تم بنجاح ولديك الآن PhoneAuthCredential يمكنك استخدامه كما هو موضح أدناه.

سجّل دخول المستخدم باستخدام رمز التحقق

بعد أن يقدّم المستخدم رمز التحقّق الوارد في الرسالة القصيرة إلى تطبيقك، عليك تسجيل دخوله من خلال إنشاء عنصر PhoneAuthCredential من رمز التحقّق ورقم تعريف التحقّق وتمريره إلى FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync.

  1. احصل على رمز إثبات الهوية من المستخدم.
  2. أنشِئ عنصر Credential من رمز إثبات الهوية ورقم تعريف إثبات الهوية.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. سجِّل دخول المستخدم باستخدام الكائن PhoneAuthCredential:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });
    

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

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

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

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // The user's Id, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server, if you
      // have one; use User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • في قاعدة بيانات Firebase في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج مستخدم، يمكنك الاتصال بالرقم SignOut():

auth.SignOut();