المصادقة مع Firebase باستخدام نظام مصادقة مخصص وC++

يمكنك دمج مصادقة Firebase مع نظام مصادقة مخصّص من خلال تعديل خادم المصادقة لإنتاج رموز مميّزة موقَّعة ومخصّصة عند تسجيل المستخدم الدخول بنجاح. يتلقّى تطبيقك هذا الرمز المميّز ويستخدمه للمصادقة مع Firebase.

قبل البدء

  1. أضِف Firebase إلى مشروع C++ الخاص بك.
  2. احصل على مفاتيح خادم مشروعك:
    1. انتقِل إلى صفحة حسابات الخدمة في إعدادات مشروعك.
    2. انقر على إنشاء مفتاح خاص جديد أسفل قسم حزمة تطوير البرامج (SDK) لمشرف Firebase من صفحة حسابات الخدمة.
    3. ويتم حفظ مفتاحَي التشفير العام/الخاص لحساب الخدمة الجديد تلقائيًا على جهاز الكمبيوتر. انسخ هذا الملف إلى خادم المصادقة.

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

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

الخطوات اللاحقة

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

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

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

auth->SignOut();