Вы можете интегрировать Firebase Authentication с собственной системой аутентификации, изменив сервер аутентификации так, чтобы он создавал специальные подписанные токены, когда пользователь успешно входит в систему. Приложение получает этот токен и использует его для аутентификации в Firebase.
Подготовка
- Добавьте Firebase в свой проект C++.
- Получите ключи сервера проекта:
-
В консоли Firebase перейдите на вкладку
Настройки > Сервисные аккаунты. - Внизу раздела Firebase Admin SDK нажмите Создать новый закрытый ключ.
- Пара открытого и закрытого ключей нового сервисного аккаунта автоматически сохранится на вашем компьютере. Скопируйте этот файл на сервер аутентификации.
-
В консоли Firebase перейдите на вкладку
Как пройти аутентификацию с помощью Firebase
КлассAuth – это шлюз для всех вызовов API.
- Добавьте файлы заголовков Auth и App:
#include <cassert> #include <cstdint> #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();