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

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

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

قبل البدء

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

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

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

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

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

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

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

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

بدء تلقّي إشعارات أسماء نقاط الوصول (APN) (أنظمة Apple الأساسية)

لاستخدام مصادقة رقم الهاتف على منصات Apple، يجب أن يتمكّن تطبيقك من تلقّي إشعارات أسماء نقاط الوصول من 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، مع تمرير رقم هاتف المستخدم إليه.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuhtOptions options;
    options.timeout_milliseconds = kAutoVerifyTimeOut;
    options.phone_number = phone_number;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(options, &phone_listener);
    
    عند الاتصال بـ PhoneAuthProvider::VerifyPhoneNumber، Firebase،
    • (على iOS) إشعار فوري صامت إلى تطبيقك
    • لإرسال رسالة قصيرة SMS تحتوي على رمز مصادقة إلى رقم الهاتف المحدد وتمرير معرف التحقق إلى دالة الإكمال. ستحتاج إلى كلّ من رمز التحقّق ورقم تعريف التحقّق لتسجيل دخول المستخدم.
  3. احفظ رقم تعريف إثبات الهوية واستعادته عند تحميل تطبيقك. ومن خلال إجراء ذلك، يمكنك التأكّد من أنّه ما زال لديك رقم تعريف صالح لإثبات الهوية في حال تم إغلاق تطبيقك قبل أن يكمل المستخدم عملية تسجيل الدخول (على سبيل المثال، أثناء التبديل إلى تطبيق SMS).

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

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

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

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

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

  1. احصل على رمز إثبات الهوية من المستخدم.
  2. أنشِئ عنصر Credential من رمز التحقّق ورقم تعريف إثبات الهوية.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. سجِّل دخول المستخدم باستخدام الكائن Credential:
    Future<User> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            User user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user.phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user.uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user.provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

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

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

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من العنصر firebase::auth::User:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // 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 firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
    
  • في قاعدة بيانات Firebase في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

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

auth->SignOut();