āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ āĻā§āĻāĻāĻžāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āϏāĻāĻšāϤ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ āĻā§āĻāĻāĻžāϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
- āĻāĻĒāύāĻžāϰ C++ āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĨ¤
- Firebase āĻāύāϏā§āϞ⧠, Auth āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤
- āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, āĻā§āĻāĻāĻžāϰ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏāĻā§āώāĻŽ āĻāϰā§āύāĨ¤
- āϏā§āĻ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āĻāύāϏā§āϞ āĻĨā§āĻā§ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ⧠API āĻā§ āĻāĻŦāĻ API āĻā§āĻĒāύ āϝā§āĻ āĻāϰā§āύ:
- āĻā§āĻāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻāĻŋ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ OAuth API āĻā§ āĻāĻŦāĻ API āĻā§āĻĒāύ āĻĒāĻžāύ⧎
- āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻžāϰ Firebase OAuth āϰāĻŋāĻĄāĻžāĻāϰā§āĻā§āĻ URI (āϝā§āĻŽāύ
my-app-12345.firebaseapp.com/__/auth/handler
) āĻāĻĒāύāĻžāϰ Twitter āĻ ā§āϝāĻžāĻĒā§āϰ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āϏā§āĻāĻŋāĻāϏ āĻĒā§āώā§āĻ āĻžāϝāĻŧ āĻāĻĒāύāĻžāϰ āĻ āύā§āĻŽā§āĻĻāύ āĻāϞāĻŦā§āϝāĻžāĻ URL āĻšāĻŋāϏā§āĻŦā§ āϏā§āĻ āĻāϰāĻž āĻāĻā§āĨ¤
- Save āĻ āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤
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 āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ
- āĻāĻāĻāĻŋ OAuth āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻāĻŦāĻ āĻāĻāĻāĻŋ OAuth āĻā§āĻĒāύ āĻĒā§āϤ⧠āĻā§āĻāĻāĻžāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύāĨ¤
- āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻĢāϞāĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ Firebase āĻļāĻāϏāĻžāĻĒāϤā§āϰā§āϰ āĻāύā§āϝ āĻā§āĻā§āύ āĻāĻŦāĻ āĻā§āĻĒāύā§āϝāĻŧāϤāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻāϰā§āύ āĻāĻŦāĻ Firebase āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ:
firebase::auth::Credential credential = firebase::auth::TwitterAuthProvider::GetCredential(token, secret); 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();