المصادقة باستخدام GitHub وC++

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام حسابات GitHub الخاصة بهم من خلال دمج مصادقة GitHub في تطبيقك.

قبل ان تبدأ

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

الوصول إلى فئة 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);
    

المصادقة مع Firebase

  1. اتبع تعليمات Android و iOS+ للحصول على رمز مميز لمستخدم GitHub الذي قام بتسجيل الدخول.
  2. بعد أن يقوم المستخدم بتسجيل الدخول بنجاح، استبدل الرمز المميز ببيانات اعتماد Firebase، ثم قم بالمصادقة مع Firebase باستخدام بيانات اعتماد Firebase:
    firebase::auth::Credential credential =
        firebase::auth::GitHubAuthProvider::GetCredential(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());
      }
    }
    
    أو، إذا كان برنامجك يعتمد على الأحداث، فقد تفضل لتسجيل رد على المستقبل .

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

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

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

لتسجيل خروج مستخدم، اتصل بـ SignOut() :

auth->SignOut();