يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على Google عن طريق دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك.
قبل البدء
- أضِف Firebase إلى مشروع C++.
- فعِّل Google كطريقة لتسجيل الدخول في وحدة تحكّم Firebase:
- في Firebase وحدة التحكّم، افتح قسم المصادقة.
- في علامة التبويب طريقة تسجيل الدخول، فعِّل طريقة تسجيل الدخول Google وانقر على حفظ.
- عندما يُطلب منك ذلك في وحدة التحكّم، نزِّل ملف إعداد Firebase المعدَّل (
google-services.json)، الذي يتضمّن الآن معلومات عميل OAuth المطلوبة لتسجيل الدخول باستخدام حساب Google. - انقل ملف الإعدادات المعدَّل هذا إلى مشروعك في "استوديو Android"، مع استبدال ملف الإعدادات المقابل الذي أصبح قديمًا. (راجِع مقالة إضافة Firebase إلى مشروع Android).
الوصول إلى صف firebase::auth::Auth
فئة Auth هي البوابة لجميع طلبات البيانات من واجهة برمجة التطبيقات.
- أضِف ملفَي رأس Auth وApp:
#include "firebase/app.h" #include "firebase/auth.h"
- في رمز التهيئة، أنشئ فئة
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__)
- احصل على فئة
firebase::auth::Authلـfirebase::App. هناك تطابق تام بينAppوAuth.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
المصادقة باستخدام Firebase
- اتّبِع التعليمات الخاصة بنظام التشغيل Android وiOS+ للحصول على رمز تعريف مميّز لتسجيل الدخول باستخدام حساب Google.
- بعد أن يسجّل المستخدم الدخول بنجاح، استبدِل رمز التعريف ببيانات اعتماد Firebase، ثم صادِق على المستخدم باستخدام بيانات اعتماد Firebase:
firebase::auth::Credential credential = firebase::auth::GoogleAuthProvider::GetCredential(google_id_token, nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
- إذا كان برنامجك يتضمّن حلقة تحديث يتم تشغيلها بانتظام (مثلاً 30 أو 60 مرة في الثانية)، يمكنك التحقّق من النتائج مرة واحدة لكل تحديث باستخدام
Auth::SignInAndRetrieveDataWithCredentialLastResult: أو إذا كان برنامجك يعتمد على الأحداث، قد تفضّل تسجيل دالة رد نداء في Future.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
تتضمّن بعض البرامج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); }
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();