المصادقة باستخدام تسجيل الدخول إلى Facebook وC++

يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على Facebook عن طريق دمج ميزة "تسجيل الدخول باستخدام Facebook" في تطبيقك.

قبل البدء

  1. أضِف Firebase إلى مشروع C++.
  2. على موقع Facebook للمطوّرين، احصل على معرّف التطبيق وسر التطبيق لتطبيقك.
  3. تفعيل تسجيل الدخول باستخدام Facebook:
    1. في وحدة تحكّم Firebase، افتح قسم المصادقة.
    2. في علامة التبويب طريقة تسجيل الدخول، فعِّل طريقة تسجيل الدخول باستخدام Facebook وحدِّد رقم تعريف التطبيق وسر التطبيق اللذين حصلت عليهما من Facebook.
    3. بعد ذلك، تأكَّد من أنّ معرّف الموارد المنتظم (URI) لإعادة التوجيه في OAuth (مثل my-app-12345.firebaseapp.com/__/auth/handler) مدرَج كأحد معرّفات الموارد المنتظمة (URI) لإعادة التوجيه في OAuth في صفحة إعدادات تطبيقك على Facebook على موقع Facebook للمطوّرين في إعدادات إعدادات المنتج > تسجيل الدخول باستخدام Facebook.

الوصول إلى صف firebase::auth::Auth

فئة Auth هي البوابة لجميع طلبات البيانات من واجهة برمجة التطبيقات.
  1. أضِف ملفَي رأس Auth وApp:
    #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);

المصادقة باستخدام Firebase

  1. اتّبِع التعليمات الخاصة بنظام التشغيل Android وiOS+ للحصول على رمز مميّز للوصول إلى حساب مستخدم Facebook الذي سجّل الدخول.
  2. بعد أن يسجّل المستخدم الدخول بنجاح، استبدِل رمز الدخول ببيانات اعتماد Firebase، ثم صادِق على Firebase باستخدام بيانات اعتماد Firebase:
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
  3. إذا كان برنامجك يتضمّن حلقة تحديث يتم تشغيلها بانتظام (مثلاً 30 أو 60 مرة في الثانية)، يمكنك التحقّق من النتائج مرة واحدة لكل تحديث باستخدام Auth::SignInAndRetrieveDataWithCredentialLastResult:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredentialLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    أو إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل دالة رد الاتصال في Future.

تسجيل دالة ردّ اتصال في 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);
}
يمكن أن تكون دالة معاودة الاتصال أيضًا 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، ويمكن استخدامه لتحديد هوية المستخدم على مستوى كل تطبيق في مشروعك، بغض النظر عن طريقة تسجيل الدخول.

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من عنصر 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();