يمكنك استخدام Firebase Authentication للسماح للمستخدمين بالمصادقة باستخدام Firebase من خلال عناوين بريدهم الإلكتروني وكلمات المرور، وإدارة الحسابات المستندة إلى كلمات المرور في تطبيقك.
قبل البدء
- أضِف Firebase إلى مشروع C++.
- إذا لم يسبق لك ربط تطبيقك بمشروع Firebase، يمكنك إجراء ذلك من وحدة تحكّم Firebase Firebase.
-
فعِّل "البريد الإلكتروني/كلمة المرور" كمزوّد لتسجيل الدخول في مشروع Firebase:
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول ، فعِّل مزوّد تسجيل الدخول البريد الإلكتروني/كلمة المرور.
- انقر على حفظ.
الوصول إلى فئة firebase::auth::Auth
فئة Auth هي بوابة لجميع طلبات البيانات من واجهة برمجة التطبيقات.
- أضِف ملفَي رأس Auth وApp:
#include "firebase/app.h" #include "firebase/auth.h"
- في رمز التهيئة، أنشِئ فئة
firebase::App.#if defined(__ANDROID__) firebase::App* app = firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity); #else firebase::App* app = firebase::App::Create(firebase::AppOptions()); #endif // defined(__ANDROID__)
- احصل على فئة
firebase::auth::Authلـfirebase::App. هناك مطابقة فردية بينAppوAuth.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
إنشاء حساب مستند إلى كلمة مرور
لإنشاء حساب مستخدم جديد بكلمة مرور، أكمل الخطوات التالية في رمز تسجيل الدخول في تطبيقك:
- عندما يشترك مستخدم جديد باستخدام نموذج الاشتراك في تطبيقك، أكمل أي خطوات جديدة للتحقق من صحة الحساب يتطلبها تطبيقك، مثل التأكّد من كتابة كلمة المرور الجديدة بشكلٍ صحيح واستيفائها لمتطلبات التعقيد.
- أنشِئ حسابًا جديدًا عن طريق تمرير عنوان البريد الإلكتروني وكلمة المرور للمستخدم الجديد
إلى
Auth::CreateUserWithEmailAndPassword:firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPassword(email, password);
- إذا كان برنامجك يتضمّن حلقة تحديث يتم تشغيلها بانتظام (مثلاً 30 أو 60
مرات في الثانية)، يمكنك التحقّق من النتائج مرة واحدة لكل تحديث باستخدام
Auth::CreateUserWithEmailAndPasswordLastResult: أو إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل معاودة الاتصال في Future.firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { const firebase::auth::AuthResult auth_result = *result.result(); printf("Create user succeeded for email %s\n", auth_result.user.email().c_str()); } else { printf("Created user failed with error '%s'\n", result.error_message()); } }
تسجيل دخول مستخدم باستخدام عنوان بريد إلكتروني وكلمة مرور
تشبه خطوات تسجيل دخول مستخدم بكلمة مرور خطوات إنشاء حساب جديد. في وظيفة تسجيل الدخول في تطبيقك، اتّبِع الخطوات التالية:
- عندما يسجّل المستخدم الدخول إلى تطبيقك، مرِّر عنوان البريد الإلكتروني و كلمة المرور للمستخدم إلى
firebase::auth::Auth::SignInWithEmailAndPasswordfirebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPassword(email, password);
- إذا كان برنامجك يتضمّن حلقة تحديث يتم تشغيلها بانتظام (مثلاً 30 أو 60
مرة في الثانية)، يمكنك التحقّق من النتائج مرة واحدة لكل تحديث باستخدام
Auth::SignInWithEmailAndPasswordLastResult: أو إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل معاودة الاتصال في Future.firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPasswordLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { const firebase::auth::AuthResult auth_result = *result.result(); printf("Sign in succeeded for email %s\n", auth_result.user.email().c_str()); } else { printf("Sign in failed with error '%s'\n", result.error_message()); } }
تسجيل معاودة الاتصال في Future
تتضمّن بعض البرامج وظائفUpdate يتم استدعاؤها 30 أو 60 مرة في الثانية.
على سبيل المثال، تتّبع العديد من الألعاب هذا النموذج. يمكن لهذه البرامج استدعاء وظائف LastResult لاستطلاع المكالمات غير المتزامنة.
ومع ذلك، إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل وظائف معاودة الاتصال.
يتم استدعاء دالّة رد الاتصال عند اكتمال Future.
void OnCreateCallback(const firebase::Future<firebase::auth::User*>& result, void* user_data) { // The callback is called when the Future enters the `complete` state. assert(result.status() == firebase::kFutureStatusComplete); // Use `user_data` to pass-in program context, if you like. MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Important to handle both success and failure situations. if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::User* user = *result.result(); printf("Create user succeeded for email %s\n", user->email().c_str()); // Perform other actions on User, if you like. firebase::auth::User::UserProfile profile; profile.display_name = program_context->display_name; user->UpdateUserProfile(profile); } else { printf("Created user failed with error '%s'\n", result.error_message()); } } void CreateUser(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // `&my_program_context` is passed verbatim to OnCreateCallback(). result.OnCompletion(OnCreateCallback, &my_program_context); }
void CreateUserUsingLambda(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // The lambda has the same signature as the callback function. result.OnCompletion( [](const firebase::Future<firebase::auth::User*>& result, void* user_data) { // `user_data` is the same as &my_program_context, below. // Note that we can't capture this value in the [] because std::function // is not supported by our minimum compiler spec (which is pre C++11). MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Process create user result... (void)program_context; }, &my_program_context); }
ننصحك بما يلي: ضبط سياسة كلمة المرور
يمكنك تحسين أمان الحساب من خلال فرض متطلبات تعقيد كلمة المرور.
لضبط سياسة كلمة المرور لمشروعك، افتح قسم سياسة كلمة المرور في علامة التبويب الأمان > المصادقة > الإعدادات في وحدة تحكّم Firebase:
Firebase Authentication تتوافق سياسات كلمات المرور مع متطلبات كلمات المرور التالية:
يجب إدخال حرف صغير
يجب إدخال حرف كبير
يجب إدخال حرف رقمي
يجب إدخال حرف غير أبجدي رقمي
تستوفي الأحرف التالية متطلبات الأحرف غير الأبجدية الرقمية:
^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~الحد الأدنى لطول كلمة المرور (يتراوح بين 6 و30 حرفًا، ويكون 6 أحرف تلقائيًا)
الحد الأقصى لطول كلمة المرور (الحد الأقصى هو 4096 حرفًا)
يمكنك تفعيل فرض سياسة كلمة المرور في وضعَين:
مطلوب: تفشل محاولات الاشتراك إلى أن يغيّر المستخدم كلمة المرور إلى كلمة تستوفي سياستك.
إشعار: يُسمح للمستخدمين بالاشتراك باستخدام كلمة مرور لا تستوفي السياسة. عند استخدام هذا الوضع، يجب التحقّق مما إذا كانت كلمة مرور المستخدم تستوفي السياسة على جانب العميل، ومطالبة المستخدم بطريقة ما بتغيير كلمة المرور إذا لم تكن تستوفي السياسة.
يُطلب من المستخدمين الجدد دائمًا اختيار كلمة مرور تستوفي سياستك.
إذا كان لديك مستخدمون نشطون، ننصحك بعدم تفعيل الترقية الإلزامية عند تسجيل الدخول إلا إذا كنت تنوي حظر وصول المستخدمين الذين لا تستوفي كلمات مرورهم سياستك. بدلاً من ذلك، استخدِم وضع الإشعار الذي يسمح للمستخدمين بتسجيل الدخول باستخدام كلمات المرور الحالية، وأخبِرهم بالمتطلبات التي لا تستوفيها كلمات المرور.
ننصحك بما يلي: تفعيل ميزة "الحماية من تعداد عناوين البريد الإلكتروني"
تُظهر بعض الطرق Firebase Authentication التي تأخذ عناوين البريد الإلكتروني كمعلّمات أخطاء معيّنة إذا كان عنوان البريد الإلكتروني غير مسجّل عندما يجب تسجيله (على سبيل المثال، عند تسجيل الدخول باستخدام عنوان بريد إلكتروني وكلمة مرور)، أو مسجّلاً عندما يجب أن يكون غير مستخدَم (على سبيل المثال، عند تغيير عنوان البريد الإلكتروني للمستخدم). على الرغم من أنّ ذلك قد يكون مفيدًا لاقتراح حلول معيّنة للمستخدمين، يمكن أيضًا أن يسيء استخدامه الجهات الضارة لاكتشاف عناوين البريد الإلكتروني التي سجّلها المستخدمون.
للحدّ من هذا الخطر، ننصحك بـ تفعيل ميزة "الحماية من تعداد عناوين البريد الإلكتروني"
لمشروعك باستخدام أداة gcloud في Google Cloud. يُرجى العِلم أنّ تفعيل هذه الميزة يغيّر سلوك الإبلاغ عن الأخطاء في Firebase Authentication، لذا تأكَّد من أنّ تطبيقك لا يعتمد على الأخطاء الأكثر تحديدًا.
الخطوات التالية
بعد أن يسجّل المستخدم الدخول لأول مرة، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد، أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات مزوّد المصادقة التي سجّل المستخدم الدخول بها. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase، ويمكن استخدامه لتحديد هوية المستخدم في كل تطبيق في مشروعك، بغض النظر عن طريقة تسجيل الدخول.
-
في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من الـ
firebase::auth::Userobject: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();