Вы можете интегрировать Firebase Authentication с собственной системой аутентификации, изменив свой сервер аутентификации таким образом, чтобы он генерировал пользовательские подписанные токены при успешном входе пользователя в систему. Ваше приложение получает этот токен и использует его для аутентификации в Firebase.
Прежде чем начать
- Добавьте Firebase в свой проект на C++ .
- Получите серверные ключи вашего проекта:
- В консоли Firebase перейдите в...
> Вкладка «Учетные записи служб» . - В нижней части раздела Firebase Admin SDK нажмите «Сгенерировать новый закрытый ключ» .
- Пара открытого и закрытого ключей новой учетной записи службы автоматически сохраняется на вашем компьютере. Скопируйте этот файл на ваш сервер аутентификации.
- В консоли Firebase перейдите в...
Аутентификация с помощью Firebase
Класс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);
Auth::SignInWithCustomToken , используя токен с вашего сервера аутентификации.- Когда пользователи входят в ваше приложение, отправьте их учетные данные (например, имя пользователя и пароль) на ваш сервер аутентификации. Ваш сервер проверяет учетные данные и возвращает пользовательский токен , если они действительны.
- После получения пользовательского токена от вашего сервера аутентификации передайте его в
Auth::SignInWithCustomTokenдля авторизации пользователя:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithCustomToken(custom_token);
- Если в вашей программе есть цикл обновления, который выполняется регулярно (например, 30 или 60 раз в секунду), вы можете проверять результаты после каждого обновления с помощью
Auth::SignInWithCustomTokenLastResult: Или, если ваша программа основана на событиях, вы можете предпочесть зарегистрировать обратный вызов в Future .firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithCustomTokenLastResult(); 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()); } }
Следующие шаги
После первого входа пользователя в систему создается новая учетная запись, которая связывается с учетными данными — то есть именем пользователя и паролем, номером телефона или информацией о поставщике аутентификации, — которые пользователь использовал для входа. Эта новая учетная запись хранится как часть вашего проекта 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
authи использовать его для управления доступом пользователя к данным.
Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Для выхода пользователя из системы вызовите SignOut() :
auth->SignOut();