يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على GitHub عن طريق دمج مصادقة GitHub في تطبيقك.
قبل البدء
- أضِف Firebase إلى مشروع C++.
- في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول، فعِّل موفِّر تسجيل الدخول GitHub.
-
أضِف معرّف العميل وسر العميل من وحدة تحكّم المطوّرين الخاصة بموفّر الخدمة إلى إعدادات موفّر الخدمة:
- سجِّل تطبيقك كتطبيق مطوّر على GitHub واحصل على معرّف العميل وسر العميل الخاصين بتطبيقك على بروتوكول OAuth 2.0.
-
تأكَّد من ضبط معرّف الموارد المنتظم لإعادة التوجيه باستخدام بروتوكول OAuth في Firebase (على سبيل المثال،
my-app-12345.firebaseapp.com/__/auth/handler) كـ عنوان URL لبرنامج معالجة نتائج التفويض في صفحة إعدادات تطبيقك على إعدادات تطبيق GitHub.
- انقر على حفظ.
الوصول إلى صف 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+ للحصول على رمز مميّز لمستخدم GitHub الذي سجّل الدخول.
- بعد أن يسجّل المستخدم الدخول بنجاح، استبدِل الرمز المميز ببيانات اعتماد Firebase، ثم صادِق على المستخدم باستخدام بيانات اعتماد Firebase:
firebase::auth::Credential credential = firebase::auth::GitHubAuthProvider::GetCredential(token); 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();