با ادغام احراز هویت GitHub در برنامه خود، می توانید به کاربران خود اجازه دهید با استفاده از حساب های GitHub خود با Firebase احراز هویت کنند.
قبل از شروع
- Firebase را به پروژه C++ خود اضافه کنید .
- در کنسول Firebase ، بخش Auth را باز کنید.
- در زبانه روش ورود به سیستم ، ارائه دهنده GitHub را فعال کنید.
- شناسه مشتری و Client Secret را از کنسول توسعه دهنده آن ارائه دهنده به پیکربندی ارائه دهنده اضافه کنید:
- برنامه خود را به عنوان یک برنامه توسعه دهنده در GitHub ثبت کنید و شناسه مشتری OAuth 2.0 و Client Secret برنامه خود را دریافت کنید.
- مطمئن شوید که URI تغییر مسیر Firebase OAuth شما (به عنوان مثال
my-app-12345.firebaseapp.com/__/auth/handler
) به عنوان URL بازگشت به تماس مجوز شما در صفحه تنظیمات برنامه شما در پیکربندی برنامه GitHub شما تنظیم شده است.
- روی ذخیره کلیک کنید.
دسترسی به firebase::auth::Auth
کلاس Auth
دروازه همه تماسهای API است.- فایلهای هدر 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 احراز هویت کنید:
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()); } }
ثبت پاسخ تماس در آینده
برخی از برنامه ها دارای توابع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
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();