يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على Google عن طريق دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك.
قبل البدء
- أضِف Firebase إلى مشروع C++ الخاص بك.
- فعِّل Google كمزوّد لتسجيل الدخول في مشروع Firebase:
- في وحدة تحكم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التتبويب طريقة تسجيل الدخول ، فعِّل مزوّد تسجيل الدخول Google.
- انقر على حفظ.
عدِّل ملف إعداد Firebase.
عندما يُطلب منك ذلك في وحدة تحكم Firebase، نزِّل ملف إعداد 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:
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::Userobject: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();