Вы можете интегрировать Firebase Authentication с собственной системой аутентификации, изменив свой сервер аутентификации для создания специальных подписанных токенов при успешном входе пользователя в систему. Ваше приложение получает этот токен и использует его для аутентификации в Firebase.
Прежде чем начать
- Добавьте Firebase в свой проект C++ .
- Получите ключи сервера вашего проекта:
- Перейдите на страницу учетных записей служб в настройках вашего проекта.
- Нажмите «Создать новый закрытый ключ» в нижней части раздела Firebase Admin SDK на странице «Учетные записи служб» .
- Пара открытого и закрытого ключей новой учетной записи службы автоматически сохраняется на вашем компьютере. Скопируйте этот файл на свой сервер аутентификации.
Аутентификация с помощью 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
: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()); } }
Или, если ваша программа управляется событиями, вы можете предпочесть зарегистрировать обратный вызов в Future .
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя, которая связывается с учетными данными (то есть именем пользователя и паролем, номером телефона или информацией поставщика аутентификации), с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта 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();