תוכל לאפשר למשתמשים לבצע אימות עם Firebase באמצעות חשבונות GitHub שלהם על ידי שילוב אימות GitHub באפליקציה שלך.
לפני שאתה מתחיל
- הוסף את Firebase לפרויקט C ++ שלך .
- במסוף Firebase , פתח את החלק Auth .
- בכרטיסיה שיטת כניסה , הפעל את ספק GitHub .
- הוסף את מזהה הלקוח וסוד הלקוח ממסוף המפתחים של ספק זה לתצורת הספק:
- רשום את האפליקציה שלך כיישום מפתח ב- GitHub וקבל את מזהה הלקוח של OAuth 2.0 ואת סוד הלקוח .
- ודא שה- URI
my-app-12345.firebaseapp.com/__/auth/handler
OAuth של Firebase שלך (למשלmy-app-12345.firebaseapp.com/__/auth/handler
) מוגדר ככתובת ה- URL להתקשרות חוזרת שלך בדף ההגדרות של האפליקציה שלך בתצורה של אפליקציית GitHub שלך.
- לחץ על שמור .
גש ל- firebase::auth::Auth
class
מחלקת Auth
היא השער לכל שיחות ה- API.- הוסף את קבצי הכותרת Auth ו- App:
#include "firebase/app.h" #include "firebase/auth.h"
- בקוד האתחול שלך, צור
firebase::App
מחלקת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
עבורfirebase::App
שלך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::User*> result = auth->SignInWithCredential(credential);
- אם לתוכנית שלך יש לולאת עדכון הפועלת באופן קבוע (נניח ב 30 או 60 פעמים בשנייה), אתה יכול לבדוק את התוצאות פעם אחת לעדכון באמצעות
Auth::SignInWithCredentialLastResult
:firebase::Future<firebase::auth::User*> result = auth->SignInWithCredentialLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::User* user = *result.result(); printf("Sign in succeeded for `%s`\n", user->display_name().c_str()); } else { printf("Sign in failed with error '%s'\n", result.error_message()); } }
לחלופין, אם התוכנית שלך מונעת אירועים, ייתכן שתעדיף להירשם התקשרות חוזרת לעתיד .
רשום התקשרות חוזרת לעתיד
בחלק מהתוכניות יש פונקציותUpdate
הנקראות 30 או 60 פעמים בשנייה. לדוגמא, משחקים רבים עוקבים אחר מודל זה. תוכניות אלה יכולות לקרוא לפונקציות LastResult
לשיחות אסינכרוניות. עם זאת, אם התוכנית שלך מונעת אירועים, ייתכן שתעדיף לרשום פונקציות להתקשרות חוזרות. פונקציית התקשרות חוזרת נקראת עם השלמת העתיד. 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::User*> 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::User*> 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
:firebase::auth::User* user = auth->current_user(); if (user != nullptr) { 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 ובכללי האבטחה של אחסון ענן, אתה יכול לקבל את מזהה המשתמש הייחודי של המשתמש
auth
ממשתנהauth
, ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.
באפשרותך לאפשר למשתמשים להיכנס לאפליקציה שלך באמצעות ספקי אימות מרובים על ידי קישור אישורי ספק האימות לחשבון משתמש קיים.
כדי לצאת ממשתמש, התקשר ל- SignOut()
:
auth->SignOut();