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

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

يوضح هذا المستند كيفية تنفيذ عملية تسجيل الدخول إلى رقم هاتف باستخدام لـ Firebase SDK.

قبل البدء

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    تختلف المتطلبات القانونية، ولكن تُعتبر من أفضل الممارسات وتحديد التوقعات للمستخدمين، يجب عليك إخبارهم بأنه إذا استخدموا تسجيل الدخول عبر الهاتف، فقد يتلقون رسالة قصيرة SMS للتحقق و1 الأسعار.

  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 يمكنك استخدامه كما هو موضّح أدناه.

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

بعد أن يقدّم المستخدم رمز التحقّق الوارد في الرسالة القصيرة SMS لتطبيقك سجِّل دخول المستخدم من خلال إنشاء 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();