يمكنك استخدام مصادقة Firebase لتسجيل دخول مستخدم عن طريق إرسال رسالة SMS إلى هاتف المستخدم. يقوم المستخدم بتسجيل الدخول باستخدام رمز يستخدم لمرة واحدة موجود في رسالة SMS.
يصف هذا المستند كيفية تنفيذ تدفق تسجيل الدخول إلى رقم الهاتف باستخدام Firebase SDK.
قبل ان تبدأ
- أضف Firebase إلى مشروع C ++ الخاص بك .
- إذا لم تكن قد ربطت تطبيقك بمشروع Firebase حتى الآن ، فافعل ذلك من وحدة تحكم Firebase .
- فهم متطلبات النظام الأساسي لتسجيل الدخول إلى رقم الهاتف:
- تسجيل الدخول باستخدام رقم الهاتف لمنصات الجوال فقط.
- في نظام iOS ، يتطلب تسجيل الدخول باستخدام رقم الهاتف جهازًا ماديًا ولن يعمل على جهاز محاكاة.
مخاوف أمنية
المصادقة باستخدام رقم هاتف فقط ، على الرغم من ملاءمتها ، إلا أنها أقل أمانًا من الطرق الأخرى المتاحة ، لأن حيازة رقم هاتف يمكن نقلها بسهولة بين المستخدمين. أيضًا ، على الأجهزة ذات ملفات تعريف المستخدمين المتعددة ، يمكن لأي مستخدم يمكنه تلقي رسائل SMS تسجيل الدخول إلى حساب باستخدام رقم هاتف الجهاز.
إذا كنت تستخدم تسجيل الدخول المستند إلى رقم الهاتف في تطبيقك ، فيجب أن تقدمه جنبًا إلى جنب مع طرق تسجيل دخول أكثر أمانًا ، وإبلاغ المستخدمين بالمقايضات الأمنية باستخدام تسجيل الدخول برقم الهاتف.
تفعيل تسجيل الدخول إلى رقم الهاتف لمشروع Firebase
لتسجيل دخول المستخدمين عن طريق الرسائل القصيرة SMS ، يجب أولاً تمكين طريقة تسجيل الدخول إلى رقم الهاتف لمشروع Firebase:
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في صفحة طريقة تسجيل الدخول ، قم بتمكين طريقة تسجيل الدخول برقم الهاتف .
الحصة النسبية لطلبات تسجيل الدخول إلى رقم هاتف Firebase عالية بما يكفي لعدم تأثر معظم التطبيقات. ومع ذلك ، إذا كنت بحاجة إلى تسجيل دخول عدد كبير جدًا من المستخدمين باستخدام مصادقة الهاتف ، فقد تحتاج إلى ترقية خطة التسعير الخاصة بك. انظر صفحة التسعير .
ابدأ في تلقي إشعارات APNs (أنظمة Apple الأساسية)
لاستخدام مصادقة رقم الهاتف على أنظمة Apple الأساسية ، يجب أن يكون تطبيقك قادرًا على تلقي إشعارات APNs من Firebase. عندما تسجّل دخول مستخدم برقم هاتفه لأول مرة على جهاز ، ترسل مصادقة Firebase إشعار دفع صامت إلى الجهاز للتحقق من أن طلب تسجيل الدخول إلى رقم الهاتف يأتي من تطبيقك. (لهذا السبب ، لا يمكن استخدام تسجيل الدخول برقم الهاتف في جهاز محاكاة.)
لتمكين إعلامات APN للاستخدام مع مصادقة Firebase:
- في Xcode ، قم بتمكين دفع الإخطارات لمشروعك.
قم بتحميل شهادة APN الخاصة بك إلى Firebase. إذا لم يكن لديك بالفعل شهادة APN ، فتأكد من إنشاء واحدة في مركز أعضاء مطوري Apple .
داخل مشروعك في وحدة تحكم Firebase ، حدد رمز الترس ، وحدد إعدادات المشروع ، ثم حدد علامة التبويب Cloud Messaging .
حدد الزر تحميل شهادة للحصول على شهادة التطوير أو شهادة الإنتاج أو كليهما. مطلوب واحد على الأقل.
لكل شهادة ، حدد ملف .p12 ، وقم بتوفير كلمة المرور ، إن وجدت. تأكد من تطابق معرّف الحزمة لهذه الشهادة مع معرّف الحزمة لتطبيقك. حدد حفظ .
أرسل رمز التحقق إلى هاتف المستخدم
لبدء تسجيل الدخول إلى رقم الهاتف ، قدم للمستخدم واجهة تطالبه بتقديم رقم هاتفه ، ثم اتصل بـ 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
على المستمع الخاص بك ، فيمكنك مطالبة المستخدم بكتابة رمز التحقق عند استلامه في رسالة 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
object: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 وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير
auth
، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم ، اتصل بـ SignOut()
:
auth->SignOut();