Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

قبل ان تبدأ

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

الوصول إلى firebase::auth::Auth الطبقة

في 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 الطبقة الخاصة بك firebase::App . هناك تعيين واحد الى واحد بين App و Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

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

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

  1. عندما يقوم مستخدم جديد بالتسجيل باستخدام نموذج الاشتراك في التطبيق الخاص بك ، أكمل أي خطوات جديدة للتحقق من صحة الحساب يتطلبها تطبيقك ، مثل التحقق من أن كلمة مرور الحساب الجديد تمت كتابتها بشكل صحيح وتفي بمتطلبات التعقيد الخاصة بك.
  2. إنشاء حساب جديد عن طريق تمرير عنوان البريد الإلكتروني للمستخدم جديد وكلمة المرور ل Auth::CreateUserWithEmailAndPassword :
    firebase::Future<firebase::auth::User*> result =
        auth->CreateUserWithEmailAndPassword(email, password);
    
  3. إذا كان البرنامج يحتوي على حلقة التحديث الذي يعمل بانتظام (ويقول في 30 أو 60 مرة في الثانية الواحدة)، يمكنك التحقق من النتائج مرة واحدة في التحديث مع Auth::CreateUserWithEmailAndPasswordLastResult :
    firebase::Future<firebase::auth::User*> result =
        auth->CreateUserWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::User* user = *result.result();
        printf("Create user succeeded for email %s\n", 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::User*> result =
        auth->SignInWithEmailAndPassword(email, password);
    
  2. إذا كان البرنامج يحتوي على حلقة التحديث الذي يعمل بانتظام (ويقول في 30 أو 60 مرة في الثانية الواحدة)، يمكنك التحقق من النتائج مرة واحدة في التحديث مع Auth::SignInWithEmailAndPasswordLastResult :
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithEmailAndPasswordLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::User* user = *result.result();
        printf("Sign in succeeded for email %s\n", 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::User*> 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::User*> 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::auth::User جوه:

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      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 الحقيقي وسحابة التخزين قواعد الأمن ، يمكنك الحصول على قعت في هوية المستخدم الفريد المستخدم من auth متغير، واستخدامها للسيطرة على ما هي البيانات على وصول ويمكن للمستخدم.

يمكنك السماح للمستخدمين تسجيل الدخول إلى التطبيق الخاص بك باستخدام موفري المصادقة متعددة عن طريق ربط المصادقة أوراق اعتماد مقدم إلى حساب مستخدم موجود.

تسجيل الخروج مستخدم، استدعاء SignOut() :

auth->SignOut();