شما میتوانید با ادغام ورود فیسبوک به برنامه خود، به کاربران خود اجازه دهید تا با استفاده از حسابهای فیسبوک خود در فایربیس احراز هویت کنند.
قبل از اینکه شروع کنی
- فایربیس را به پروژه ++C خود اضافه کنید .
- در سایت فیسبوک برای توسعهدهندگان ، شناسه برنامه (App ID) و راز برنامه (App Secret) را برای برنامه خود دریافت کنید.
- ورود به سیستم فیسبوک را به عنوان ارائه دهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
- در تب روش ورود ، ارائهدهنده ورود به سیستم فیسبوک را فعال کنید و شناسه برنامه (App ID) و راز برنامه (App Secret) را که از فیسبوک دریافت کردهاید، مشخص کنید.
- مطمئن شوید که آدرس اینترنتی تغییر مسیر OAuth شما (برای مثال،
my-app-12345.firebaseapp.com/__/auth/handler) به عنوان یکی از آدرسهای اینترنتی تغییر مسیر OAuth شما در صفحه تنظیمات برنامه فیسبوک شما در سایت فیسبوک برای توسعهدهندگان، در تنظیمات محصول > پیکربندی ورود به سیستم فیسبوک ، فهرست شده باشد.
به کلاس 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);
احراز هویت با فایربیس
- برای دریافت توکن دسترسی برای کاربر وارد شده در فیسبوک، دستورالعملهای مربوط به اندروید و iOS+ را دنبال کنید.
- پس از اینکه کاربر با موفقیت وارد سیستم شد، توکن دسترسی را با یک اعتبارنامه Firebase مبادله کنید و با استفاده از اعتبارنامه Firebase با Firebase احراز هویت کنید:
firebase::auth::Credential credential = firebase::auth::FacebookAuthProvider::GetCredential(access_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(); }
در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، میتوانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر
authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد، استفاده کنید.
برای خروج کاربر، تابع SignOut() فراخوانی کنید:
auth->SignOut();