使用 Facebook 登入和 C++ 進行驗證
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
您可以讓使用者利用 Facebook 帳戶向 Firebase 進行驗證
整合 Facebook 登入應用程式。
事前準備
- 將 Firebase 新增至您的 C++ 專案。
- 在 Facebook for Developers 上
網站,請取得應用程式的「應用程式 ID」和「應用程式密鑰」。
- 啟用 Facebook 登入:
- 在 Firebase 控制台中開啟「Auth」專區。
- 在「Sign in method」分頁中,啟用 Facebook 登入功能
方法,並指定您從 Facebook 取得的「應用程式 ID」和「應用程式密鑰」。
- 接著,請確認您的 OAuth 重新導向 URI (例如
my-app-12345.firebaseapp.com/__/auth/handler
)
是您 Facebook 應用程式設定頁面的其中一個 OAuth 重新導向 URI,
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::App
的 firebase::auth::Auth
類別。
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)
每秒可執行 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 Facebook accounts\nby integrating Facebook Login into your app.\n\nBefore you begin\n\n1. [Add Firebase to your C++ project](/docs/cpp/setup#note_select_platform).\n2. On the [Facebook for Developers](https://developers.facebook.com/) site, get the **App ID** and an **App Secret** for your app.\n3. Enable Facebook Login:\n 1. In the [Firebase console](//console.firebase.google.com/), open the **Auth** section.\n 2. On the **Sign in method** tab, enable the **Facebook** sign-in method and specify the **App ID** and **App Secret** you got from Facebook.\n 3. Then, make sure your **OAuth redirect URI** (e.g. `my-app-12345.firebaseapp.com/__/auth/handler`) is listed as one of your **OAuth redirect URIs** in your Facebook app's settings page on the [Facebook for Developers](https://developers.facebook.com/) site in the **Product Settings \\\u003e Facebook Login** config.\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/facebook-login#authenticate_with_firebase) and [iOS+](/docs/auth/ios/facebook-login#authenticate_with_firebase) to get an access token for the signed-in Facebook user.\n2. After a user successfully signs in, exchange the access token for a Firebase credential, and authenticate with Firebase using the Firebase credential: \n\n ```c++\n firebase::auth::Credential credential =\n firebase::auth::FacebookAuthProvider::GetCredential(access_token);\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```"]]