Вы можете разрешить своим пользователям аутентифицироваться в Firebase, используя их учетные записи Facebook, интегрировав вход через Facebook в свое приложение.
Прежде чем начать
- Добавьте Firebase в свой проект C++ .
- На сайте Facebook для разработчиков получите идентификатор приложения и секрет приложения для своего приложения.
- Включить вход через Facebook:
- В консоли Firebase откройте раздел Auth .
- На вкладке «Метод входа» включите метод входа в Facebook и укажите идентификатор приложения и секрет приложения, полученные от Facebook.
- Затем убедитесь, что ваш URI перенаправления OAuth (например,
my-app-12345.firebaseapp.com/__/auth/handler
) указан в качестве одного из ваших URI перенаправления OAuth на странице настроек вашего приложения Facebook на сайте Facebook для разработчиков в Продукте. Настройки > Конфигурация входа в Facebook .
Доступ к классу firebase::auth::Auth
Класс Auth
является шлюзом для всех вызовов API.- Добавьте файлы заголовков Auth и App:
#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::auth::Auth
для вашегоfirebase::App
. Между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 раз в секунду), вы можете проверять результаты один раз за обновление с помощью
Auth::SignInAndRetrieveDataWithCredentialLastResult
: Или, если ваша программа управляется событиями, вы можете предпочесть зарегистрировать обратный вызов в Future .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
для опроса асинхронных вызовов. Однако, если ваша программа управляется событиями, вы можете предпочесть зарегистрировать функции обратного вызова. Функция обратного вызова вызывается после завершения 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); }
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 и может использоваться для идентификации пользователя в каждом приложении вашего проекта, независимо от того, как пользователь входит в систему.
В ваших приложениях вы можете получить базовую информацию профиля пользователя из объекта
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 Firebase вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации , связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите SignOut()
:
auth->SignOut();