אפשר לאפשר למשתמשים לבצע אימות ב-Firebase באמצעות חשבונות Facebook שלהם על ידי שילוב Facebook Login באפליקציה.
לפני שמתחילים
- מוסיפים את Firebase לפרויקט C++.
- ב-Facebook למפתחים מקבלים את מזהה האפליקציה וסוד אפליקציה עבור האפליקציה.
- אפשר התחברות ל-Facebook:
- במסוף Firebase, פותחים את הקטע Auth.
- בכרטיסייה שיטת כניסה, מפעילים את הכניסה ל-Facebook ומציינים את מזהה האפליקציה ואת הסוד של האפליקציה שקיבלתם מ-Facebook.
- לאחר מכן מוודאים שה-URI של OAuth להפניה אוטומטית (למשל
my-app-12345.firebaseapp.com/__/auth/handler
) רשום כאחד ממזהי ה-URI להפניה אוטומטית של OAuth בדף ההגדרות של אפליקציית Facebook ב באתר של Facebook for Developers הגדרות מוצר > הגדרת Facebook Login.
גישה לכיתה firebase::auth::Auth
המחלקה Auth
היא השער לכל הקריאות ל-API.
- מוסיפים את קובצי הכותרת 'אימות' ו'אפליקציה':
#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+ כדי לקבל אסימון גישה למשתמש ב-Facebook שנכנס לחשבון.
- אחרי שמשתמש נכנס, מחליפים את אסימון הגישה ב
פרטי כניסה ל-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
: לחלופין, אם התוכנית שלכם מבוססת על אירועים, תוכלו לרשום קריאה חוזרת (callback) ב-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()); } }
רישום קריאה חוזרת (callback) בעתיד
בחלק מהתוכניות יש פונקציותUpdate
שנקראות 30 או 60 פעמים בשנייה.
לדוגמה, יש הרבה משחקים שמבוססים על המודל הזה. תוכניות כאלה יכולות להפעיל את הפונקציות LastResult
כדי לבצע סקרים של קריאות אסינכרוניות.
עם זאת, אם התוכנית שלכם מבוססת על אירועים, יכול להיות שתעדיפו לרשום פונקציות קריאה חוזרת (callback).
פונקציית קריאה חוזרת נקראת בסיום ה-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();