āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ Google āϏāĻžāĻāύ-āĻāύ āϏāĻāĻšāϤ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ Google āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
- āĻāĻĒāύāĻžāϰ C++ āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĨ¤
- Firebase āĻāύāϏā§āϞ⧠āĻāĻāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ Google āϏāĻā§āώāĻŽ āĻāϰā§āύ:
- Firebase āĻāύāϏā§āϞ⧠, Auth āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤
- āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, Google āϏāĻžāĻāύ-āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āϏāĻā§āώāĻŽ āĻāϰā§āύ āĻāĻŦāĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āύ āĻā§āϞāĻŋāĻ āĻāϰā§āύ⧎
- āĻāύāϏā§āϞ⧠āĻĒā§āϰāĻŽā§āĻĒāĻ āĻāϰāĻž āĻšāϞā§, āĻāĻĒāĻĄā§āĻ āĻāϰāĻž Firebase āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĢāĻžāĻāϞāĻāĻŋ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ (
google-services.json
), āϝā§āĻāĻŋāϤ⧠āĻāĻāύ Google āϏāĻžāĻāύ-āĻāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ OAuth āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āϤāĻĨā§āϝ āϰāϝāĻŧā§āĻā§āĨ¤ - āĻāĻ āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻĢāĻžāĻāϞāĻāĻŋāĻā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āϏā§āĻā§āĻĄāĻŋāĻ āĻĒā§āϰāĻāϞā§āĻĒā§ āϏāϰāĻžāύ, āĻāĻāύ-āϏā§āĻā§āϞ⧠āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻĢāĻžāĻāϞāĻāĻŋ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ āĨ¤ ( āĻāĻĒāύāĻžāϰ Android āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĻĻā§āĻā§āύāĨ¤)
firebase::auth::Auth
āĻā§āϞāĻžāϏ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰā§āύ
Auth
āĻā§āϞāĻžāϏ āĻšāϞ āϏāĻŽāϏā§āϤ API āĻāϞā§āϰ āĻā§āĻāĻāϝāĻŧā§āĨ¤- Auth āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĒ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞ āϝā§āĻ āĻāϰā§āύ:
#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::App
āĻāϰ āĻāύā§āϝfirebase::auth::Auth
āĻā§āϞāĻžāϏ āĻ āϰā§āĻāύ āĻāϰā§āύāĨ¤App
āĻāĻŦāĻAuth
āĻāϰ āĻŽāϧā§āϝ⧠āĻāϝāĻŧāĻžāύ-āĻā§-āĻāϝāĻŧāĻžāύ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻāĻā§āĨ¤firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Firebase āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ
- Google āϏāĻžāĻāύ āĻāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻāĻĄāĻŋ āĻā§āĻā§āύ āĻĒā§āϤ⧠Android āĻāĻŦāĻ iOS+ āĻāϰ āĻāύā§āϝ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ⧎
- āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻĢāϞāĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ Firebase āĻļāĻāϏāĻžāĻĒāϤā§āϰā§āϰ āĻāύā§āϝ ID āĻā§āĻā§āύ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻāϰā§āύ āĻāĻŦāĻ Firebase āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ:
firebase::auth::Credential credential = firebase::auth::GoogleAuthProvider::GetCredential(google_id_token, nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
- āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻāĻāĻāĻŋ āĻāĻĒāĻĄā§āĻ āϞā§āĻĒ āĻĨāĻžāĻā§ āϝāĻž āύāĻŋāϝāĻŧāĻŽāĻŋāϤāĻāĻžāĻŦā§ āĻāϞ⧠(āĻŦāϞā§āύ āĻĒā§āϰāϤāĻŋ āϏā§āĻā§āύā§āĻĄā§ 30 āĻŦāĻž 60 āĻŦāĻžāϰ), āĻāĻĒāύāĻŋ
Auth::SignInAndRetrieveDataWithCredentialLastResult
āĻāϰ āϏāĻžāĻĨā§ āĻāĻĒāĻĄā§āĻ āĻĒā§āϰāϤāĻŋ āĻāĻāĻŦāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ : āĻ āĻĨāĻŦāĻž, āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻā§āύā§āĻ āĻāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āĻāĻĒāύāĻŋ āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻāĻāĻāĻŋ āĻāϞāĻŦā§āϝāĻžāĻ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĒāĻāύā§āĻĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤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
āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāĻā§ āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻā§āύā§āĻ āĻāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āĻāĻĒāύāĻŋ āĻāϞāĻŦā§āϝāĻžāĻ āĻĢāĻžāĻāĻļāύ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĒāĻāύā§āĻĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻāĻŋ āĻāϞāĻŦā§āϝāĻžāĻ āĻĢāĻžāĻāĻļāύ āĻāĻŦāĻŋāώā§āϝāϤ āϏāĻŽāĻžāĻĒā§āϤāĻŋāϰ āĻāĻĒāϰ āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤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::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();