يمكنك استخدام Firebase Authentication لتسجيل دخول مستخدم من خلال إرسال رسالة SMS إلى هاتفه. يسجّل المستخدم الدخول باستخدام رمز صالح لمرة واحدة وارد في رسالة SMS.
يوضّح هذا المستند كيفية تنفيذ عملية تسجيل الدخول باستخدام رقم الهاتف من خلال حزمة تطوير البرامج (SDK) من Firebase.
قبل البدء
- أضِف Firebase إلى مشروع C++.
- إذا لم يسبق لك ربط تطبيقك بمشروع Firebase، يمكنك إجراء ذلك من وحدة تحكّم Firebase.
- تعرَّف على متطلبات النظام الأساسي لتسجيل الدخول باستخدام رقم الهاتف:
- تتوفّر ميزة "تسجيل الدخول باستخدام رقم الهاتف" على المنصات المتوافقة مع الأجهزة الجوّالة فقط.
- على نظام التشغيل iOS، يتطلّب تسجيل الدخول باستخدام رقم الهاتف جهازًا فعليًا ولن يعمل على محاكي.
المخاوف المرتبطة بالأمان
على الرغم من أنّ المصادقة باستخدام رقم الهاتف فقط هي طريقة سهلة، إلا أنّها أقل أمانًا من الطرق الأخرى المتاحة، لأنّه يمكن نقل ملكية رقم الهاتف بسهولة بين المستخدمين. بالإضافة إلى ذلك، على الأجهزة التي تتضمّن ملفات شخصية متعددة للمستخدمين، يمكن لأي مستخدم تلقّي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك، عليك توفيره إلى جانب طرق تسجيل دخول أكثر أمانًا، وإبلاغ المستخدمين بالمخاطر الأمنية المحتملة عند استخدام تسجيل الدخول المستند إلى رقم الهاتف.
تفعيل ميزة تسجيل الدخول باستخدام رقم الهاتف لمشروع Firebase
لتسجيل دخول المستخدمين باستخدام الرسائل القصيرة، عليك أولاً تفعيل طريقة تسجيل الدخول باستخدام رقم الهاتف لمشروع Firebase:
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر خدمة تسجيل الدخول عبر الهاتف.
-
اضبط سياسة بشأن المناطق التي تريد السماح فيها بإرسال رسائل SMS أو حظر ذلك. يمكن أن يساعد وضع سياسة منطقة الرسائل القصيرة في حماية تطبيقاتك من إساءة استخدام الرسائل القصيرة. بالنسبة إلى المشاريع الجديدة، لا تسمح السياسة التلقائية بأي مناطق.
- في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب الأمان > المصادقة > الإعدادات.
- في قسم سياسة منطقة الرسائل القصيرة، اضبط سياسة منطقة الرسائل القصيرة.
بدء تلقّي إشعارات APNs (منصات Apple)
لاستخدام ميزة المصادقة باستخدام رقم الهاتف على منصات Apple، يجب أن يكون تطبيقك قادرًا على تلقّي إشعارات APNs من Firebase. عندما يسجّل المستخدم الدخول باستخدام رقم هاتفه للمرة الأولى على أحد الأجهزة، يرسل Firebase Authentication إشعارًا صامتًا إلى الجهاز للتأكّد من أنّ طلب تسجيل الدخول باستخدام رقم الهاتف وارد من تطبيقك. (لهذا السبب، لا يمكن استخدام ميزة تسجيل الدخول باستخدام رقم الهاتف على المحاكي).
لتفعيل إشعارات APNs لاستخدامها مع Firebase Authentication، اتّبِع الخطوات التالية:
- في Xcode، فعِّل الإشعارات الفورية لمشروعك.
حمِّل شهادة APNs إلى Firebase. إذا لم يكن لديك شهادة APNs، احرص على إنشاء شهادة في مركز أعضاء مطوّري Apple.
-
في وحدة تحكّم Firebase، انتقِل إلى
الإعدادات > الإعدادات العامة. بعد ذلك، انقر على علامة التبويب خدمة المراسلة عبر السحابة الإلكترونية. - انقر على تحميل الشهادة لشهادة التطوير أو شهادة الإنتاج أو كليهما. ويجب توفير طريقة اتصال واحدة على الأقل.
-
لكل شهادة، اختَر ملف
.p12وقدِّم كلمة المرور، إن وُجدت. تأكَّد من أنّ معرّف الحزمة لهذه الشهادة يتطابق مع معرّف حزمة تطبيقك، ثم انقر على حفظ.
-
في وحدة تحكّم Firebase، انتقِل إلى
إرسال رمز التحقّق إلى هاتف المستخدم
لبدء عملية تسجيل الدخول باستخدام رقم الهاتف، اعرض على المستخدم واجهة تطلب منه تقديم رقم هاتفه، ثم استدعِ الدالة PhoneAuthProvider::VerifyPhoneNumber لطلب أن يرسل Firebase رمز مصادقة إلى هاتف المستخدم عبر الرسائل القصيرة:
-
الحصول على رقم هاتف المستخدم
تختلف المتطلبات القانونية، ولكن كأفضل ممارسة ولتوضيح التوقعات للمستخدمين، عليك إعلامهم بأنّه في حال استخدام ميزة "تسجيل الدخول باستخدام الهاتف"، قد يتلقّون رسالة SMS لإثبات الملكية وسيتم تطبيق الأسعار العادية.
- اتّصِل بالدالة
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 تحتوي على رمز مصادقة إلى رقم الهاتف المحدّد، وتمرّر معرّف تأكيد إلى دالة الإكمال. ستحتاج إلى كل من رمز التحقّق ومعرّف التحقّق لتسجيل دخول المستخدم.
-
احفظ معرّف إثبات الملكية واستعِده عند تحميل تطبيقك. من خلال إجراء ذلك، يمكنك التأكّد من أنّ لديك معرّف تحقّق صالحًا إذا تم إيقاف تطبيقك قبل أن يكمل المستخدم عملية تسجيل الدخول (على سبيل المثال، أثناء التبديل إلى تطبيق SMS).
يمكنك الاحتفاظ بمعرّف التحقّق بأي طريقة تريدها. إذا كنت تكتب باستخدام إطار عمل C++ من عدّة منصات، يجب أن يوفّر إشعارات بشأن إنهاء التطبيق واستعادته. في هذه الأحداث، يمكنك حفظ رقم تعريف عملية إثبات الملكية واستعادته، على التوالي.
إذا أدّت المكالمة إلى VerifyPhoneNumber إلى تلقّي OnCodeSent على جهاز Listener، يمكنك أن تطلب من المستخدم كتابة رمز التحقّق عندما يتلقّاه في رسالة SMS.
من ناحية أخرى، إذا أدّى طلب VerifyPhoneNumber إلى عرض OnVerificationCompleted، يعني ذلك أنّ عملية إثبات الملكية التلقائي قد نجحت، وسيصبح لديك PhoneAuthCredential يمكنك استخدامه كما هو موضّح أدناه.
تسجيل دخول المستخدم باستخدام رمز التحقّق
بعد أن يقدّم المستخدم لتطبيقك رمز التحقّق الوارد في رسالة SMS، سجِّل دخول المستخدم من خلال إنشاء عنصر PhoneAuthCredential من رمز التحقّق ومعرّف التحقّق وتمرير هذا العنصر إلى Auth::SignInWithCredential.
- احصل على رمز التحقّق من المستخدم.
- أنشئ عنصر
Credentialمن رمز التحقّق ومعرّف التحقّق.PhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- سجِّل دخول المستخدم باستخدام العنصر
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 Realtime Database وCloud Storage قواعد الأمان، يمكنك الحصول على معرّف المستخدِم الفريد للمستخدِم الذي سجّل الدخول من المتغيّر
auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدِم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفّري مصادقة متعدّدين من خلال ربط بيانات اعتماد موفّر المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم، اتّصِل بالرقم
SignOut():
auth->SignOut();