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

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

قبل البدء

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

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

فئة 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);
استدعِ 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());
      }
    }
    بدلاً من ذلك، إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل معاودة الاتصال في Future.

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

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

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

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

auth->SignOut();