المصادقة مع Firebase باستخدام حسابات تستند إلى كلمة مرور باستخدام C ++

يمكنك استخدام مصادقة Firebase للسماح للمستخدمين بالمصادقة باستخدام Firebase باستخدام عناوين البريد الإلكتروني وكلمات المرور الخاصة بهم ، ولإدارة الحسابات المستندة إلى كلمة مرور التطبيق.

قبل ان تبدأ

  1. أضف Firebase إلى مشروع C ++ الخاص بك .
  2. إذا لم تكن قد ربطت تطبيقك بمشروع Firebase حتى الآن ، فافعل ذلك من وحدة تحكم Firebase .
  3. تفعيل تسجيل الدخول إلى البريد الإلكتروني / كلمة المرور:
    1. في وحدة تحكم Firebase ، افتح قسم المصادقة .
    2. في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين طريقة تسجيل الدخول إلى البريد الإلكتروني / كلمة المرور وانقر فوق حفظ .

قم بالوصول إلى firebase::auth::Auth class

فئة Auth هي البوابة لجميع استدعاءات API.
  1. قم بإضافة ملفات رأس التطبيق والمصادقة:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. في رمز التهيئة ، أنشئ فئة 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__)
    
  3. احصل على firebase::auth::Auth class لـ firebase::App . هناك تعيين واحد لواحد بين App Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

قم بإنشاء حساب مستند إلى كلمة المرور

لإنشاء حساب مستخدم جديد بكلمة مرور ، أكمل الخطوات التالية في رمز تسجيل الدخول لتطبيقك:

  1. عندما يقوم مستخدم جديد بالتسجيل باستخدام نموذج الاشتراك في التطبيق الخاص بك ، أكمل أي خطوات التحقق من صحة الحساب الجديدة التي يتطلبها تطبيقك ، مثل التحقق من أن كلمة مرور الحساب الجديد تمت كتابتها بشكل صحيح وتفي بمتطلبات التعقيد الخاصة بك.
  2. قم بإنشاء حساب جديد عن طريق تمرير عنوان البريد الإلكتروني وكلمة المرور للمستخدم الجديد إلى Auth::CreateUserWithEmailAndPassword :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->CreateUserWithEmailAndPassword(email, password);
    
  3. إذا كان برنامجك يحتوي على حلقة تحديث تعمل بانتظام (لنقل 30 أو 60 مرة في الثانية) ، فيمكنك التحقق من النتائج مرة واحدة لكل تحديث باستخدام Auth::CreateUserWithEmailAndPasswordLastResult :
    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());
      }
    }
    
    أو إذا كان برنامجك مدفوعًا بالأحداث ، فقد تفضل لتسجيل رد اتصال على المستقبل .

سجّل دخول مستخدم بعنوان بريد إلكتروني وكلمة مرور

تشبه خطوات تسجيل دخول مستخدم بكلمة مرور خطوات إنشاء حساب جديد. في وظيفة تسجيل الدخول لتطبيقك ، قم بما يلي:

  1. عندما يقوم المستخدم بتسجيل الدخول إلى تطبيقك ، قم بتمرير عنوان البريد الإلكتروني وكلمة المرور للمستخدم إلى firebase::auth::Auth::SignInWithEmailAndPassword :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithEmailAndPassword(email, password);
    
  2. إذا كان برنامجك يحتوي على حلقة تحديث تعمل بانتظام (لنقل 30 أو 60 مرة في الثانية) ، فيمكنك التحقق من النتائج مرة واحدة لكل تحديث باستخدام Auth::SignInWithEmailAndPasswordLastResult :
    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());
      }
    }
    
    أو إذا كان برنامجك مدفوعًا بالأحداث ، فقد تفضل لتسجيل رد اتصال على المستقبل .

تسجيل معاودة الاتصال على المستقبل

تحتوي بعض البرامج على وظائف Update تسمى 30 أو 60 مرة في الثانية. على سبيل المثال ، تتبع العديد من الألعاب هذا النموذج. يمكن لهذه البرامج استدعاء وظائف LastResult المكالمات غير المتزامنة. ومع ذلك ، إذا كان برنامجك مدفوعًا بالأحداث ، فقد تفضل تسجيل وظائف رد الاتصال. يتم استدعاء وظيفة رد الاتصال عند الانتهاء من المستقبل.
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);
}
يمكن أن تكون وظيفة رد الاتصال lambda ، إذا كنت تفضل ذلك.
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 التي تأخذ عناوين البريد الإلكتروني كمعلمات إلى أخطاء محددة إذا كان عنوان البريد الإلكتروني غير مسجَّل عندما يجب تسجيله (على سبيل المثال ، عند تسجيل الدخول باستخدام عنوان بريد إلكتروني وكلمة مرور) ، أو تسجيله عندما يجب أن يكون غير مستخدم (على سبيل المثال ، عند تغيير عنوان البريد الإلكتروني للمستخدم). في حين أن هذا يمكن أن يكون مفيدًا لاقتراح علاجات محددة للمستخدمين ، إلا أنه يمكن أيضًا إساءة استخدامه من قبل الجهات الضارة لاكتشاف عناوين البريد الإلكتروني المسجلة من قبل المستخدمين لديك.

للتخفيف من هذه المخاطر ، نوصيك بتمكين حماية تعداد البريد الإلكتروني لمشروعك باستخدام أداة Google Cloud gcloud . لاحظ أن تمكين هذه الميزة يغير سلوك الإبلاغ عن أخطاء Firebase Authentication: تأكد من أن تطبيقك لا يعتمد على أخطاء أكثر تحديدًا.

الخطوات التالية

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