使用 Google 登入和 C++ 進行驗證
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
您可以讓使用者透過自己的 Google 帳戶,以 Firebase 進行驗證,步驟如下:
將 Google 登入整合至您的應用程式
事前準備
- 將 Firebase 新增至您的 C++ 專案。
- 在 Firebase 控制台中啟用 Google 做為登入方式:
- 在 Firebase 控制台中開啟
找到「Auth」專區。
- 在「Sign in method」分頁中啟用 Google 登入方式
然後按一下「儲存」。
- 當控制台顯示提示時,下載更新後的 Firebase 設定檔
(
google-services.json
),目前包含 OAuth 用戶端資訊
登入 Google 帳戶。
- 將這個更新後的設定檔移至 Android Studio 專案,取代
過時的對應設定檔。
(請參閱「將 Firebase 新增至 Android 專案」)。
存取 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::App
的 firebase::auth::Auth
類別。
App
和 Auth
之間有一對一的對應關係。
firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
透過 Firebase 驗證
- 請依下列說明操作:
Android
和 iOS+
取得 Google 登入的 ID 權杖。
- 使用者成功登入後,請輸入 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)
每秒可執行 1 次
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());
}
}
敬上
或者,如果您的計畫是依據事件推動,建議您
在
Future。
在 Future 上註冊回呼
某些程式包含可呼叫每秒 30 或 60 次的
Update
函式。
舉例來說,許多遊戲都採用這個模型。這些程式可以呼叫
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);
}
敬上
如有需要,回呼函式也可以是 lambda。
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 專案的一部分,可用來識別
即可限制使用者登入專案中的所有應用程式
您可以讓使用者透過多重驗證機制登入您的應用程式
將驗證供應商憑證連結至
現有的使用者帳戶
如要登出使用者,請呼叫
SignOut()
:
auth->SignOut();
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-16 (世界標準時間)。
[null,null,["上次更新時間:2025-08-16 (世界標準時間)。"],[],[],null,["You can let your users authenticate with Firebase using their Google Accounts by\nintegrating Google Sign-In into your app.\n\nBefore you begin\n\n1. [Add Firebase to your C++ project](/docs/cpp/setup#note_select_platform).\n2. Enable Google as a sign-in method in the Firebase console:\n 1. In the [Firebase console](//console.firebase.google.com/), open the **Auth** section.\n 2. On the **Sign in method** tab, enable the **Google** sign-in method and click **Save**.\n3. When prompted in the console, download the updated Firebase config file (`google-services.json`), which now contains the OAuth client information required for Google sign-in.\n4. Move this updated config file into your Android Studio project, *replacing* the now-outdated corresponding config file. (See [Add Firebase to your Android project](/docs/android/setup#add-config-file).)\n\nAccess the `firebase::auth::Auth` class The `Auth` class is the gateway for all API calls.\n\n1. Add the Auth and App header files: \n\n ```c++\n #include \"firebase/app.h\"\n #include \"firebase/auth.h\"\n ```\n2. In your initialization code, create a [`firebase::App`](/docs/reference/cpp/class/firebase/app) class. \n\n ```c++\n #if defined(__ANDROID__)\n firebase::App* app =\n firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);\n #else\n firebase::App* app = firebase::App::Create(firebase::AppOptions());\n #endif // defined(__ANDROID__)\n ```\n3. Acquire the `firebase::auth::Auth` class for your `firebase::App`. There is a one-to-one mapping between `App` and `Auth`. \n\n ```c++\n firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);\n ```\n\nAuthenticate with Firebase\n\n1. Follow instructions for [Android](/docs/auth/android/google-signin#authenticate_with_firebase) and [iOS+](/docs/auth/ios/google-signin#2_implement_google_sign-in) to get an ID token for the Google sign in.\n2. After a user successfully signs in, exchange the ID token for a Firebase credential, and authenticate with Firebase using the Firebase credential: \n\n ```c++\n firebase::auth::Credential credential =\n firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,\n nullptr);\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n auth-\u003eSignInAndRetrieveDataWithCredential(credential);\n ```\n3. If your program has an update loop that runs regularly (say at 30 or 60 times per second), you can check the results once per update with `Auth::SignInAndRetrieveDataWithCredentialLastResult`: \n\n ```c++\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n auth-\u003eSignInAndRetrieveDataWithCredentialLastResult();\n if (result.status() == firebase::kFutureStatusComplete) {\n if (result.error() == firebase::auth::kAuthErrorNone) {\n firebase::auth::AuthResult auth_result = *result.result();\n printf(\"Sign in succeeded for `%s`\\n\",\n auth_result.user.display_name().c_str());\n } else {\n printf(\"Sign in failed with error '%s'\\n\", result.error_message());\n }\n }\n ```\n Or, if your program is event driven, you may prefer to [register a callback on the\n Future](#register_callback_on_future).\n\nRegister a callback on a Future Some programs have `Update` functions that are called 30 or 60 times per second. For example, many games follow this model. These programs can call the `LastResult` functions to poll asynchronous calls. However, if your program is event driven, you may prefer to register callback functions. A callback function is called upon completion of the Future. \n\n```c++\nvoid OnCreateCallback(const firebase::Future\u003cfirebase::auth::User*\u003e& result,\n void* user_data) {\n // The callback is called when the Future enters the `complete` state.\n assert(result.status() == firebase::kFutureStatusComplete);\n\n // Use `user_data` to pass-in program context, if you like.\n MyProgramContext* program_context = static_cast\u003cMyProgramContext*\u003e(user_data);\n\n // Important to handle both success and failure situations.\n if (result.error() == firebase::auth::kAuthErrorNone) {\n firebase::auth::User* user = *result.result();\n printf(\"Create user succeeded for email %s\\n\", user-\u003eemail().c_str());\n\n // Perform other actions on User, if you like.\n firebase::auth::User::UserProfile profile;\n profile.display_name = program_context-\u003edisplay_name;\n user-\u003eUpdateUserProfile(profile);\n\n } else {\n printf(\"Created user failed with error '%s'\\n\", result.error_message());\n }\n}\n\nvoid CreateUser(firebase::auth::Auth* auth) {\n // Callbacks work the same for any firebase::Future.\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n auth-\u003eCreateUserWithEmailAndPasswordLastResult();\n\n // `&my_program_context` is passed verbatim to OnCreateCallback().\n result.OnCompletion(OnCreateCallback, &my_program_context);\n}\n```\nThe callback function can also be a lambda, if you prefer. \n\n```c++\nvoid CreateUserUsingLambda(firebase::auth::Auth* auth) {\n // Callbacks work the same for any firebase::Future.\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n auth-\u003eCreateUserWithEmailAndPasswordLastResult();\n\n // The lambda has the same signature as the callback function.\n result.OnCompletion(\n [](const firebase::Future\u003cfirebase::auth::User*\u003e& result,\n void* user_data) {\n // `user_data` is the same as &my_program_context, below.\n // Note that we can't capture this value in the [] because std::function\n // is not supported by our minimum compiler spec (which is pre C++11).\n MyProgramContext* program_context =\n static_cast\u003cMyProgramContext*\u003e(user_data);\n\n // Process create user result...\n (void)program_context;\n },\n &my_program_context);\n}\n```\n\nNext steps\n\nAfter a user signs in for the first time, a new user account is created and\nlinked to the credentials---that is, the user name and password, phone\nnumber, or auth provider information---the user signed in with. This new\naccount is stored as part of your Firebase project, and can be used to identify\na user across every app in your project, regardless of how the user signs in.\n\n- In your apps, you can get the user's basic profile information from the\n [`firebase::auth::User`](/docs/reference/cpp/class/firebase/auth/user) object:\n\n ```c++\n firebase::auth::User user = auth-\u003ecurrent_user();\n if (user.is_valid()) {\n std::string name = user.display_name();\n std::string email = user.email();\n std::string photo_url = user.photo_url();\n // The user's ID, unique to the Firebase project.\n // Do NOT use this value to authenticate with your backend server,\n // if you have one. Use firebase::auth::User::Token() instead.\n std::string uid = user.uid();\n }\n ```\n- In your Firebase Realtime Database and Cloud Storage\n [Security Rules](/docs/database/security/user-security), you can\n get the signed-in user's unique user ID from the `auth` variable,\n and use it to control what data a user can access.\n\nYou can allow users to sign in to your app using multiple authentication\nproviders by [linking auth provider credentials to an\nexisting user account.](/docs/auth/cpp/account-linking)\n\nTo sign out a user, call [`SignOut()`](/docs/reference/cpp/class/firebase/auth/auth#signout): \n\n```c++\nauth-\u003eSignOut();\n```"]]