Аутентификация с помощью Firebase с использованием специальной системы аутентификации и C++

Вы можете интегрировать Firebase Authentication с собственной системой аутентификации, изменив свой сервер аутентификации для создания специальных подписанных токенов при успешном входе пользователя в систему. Ваше приложение получает этот токен и использует его для аутентификации в Firebase.

Прежде чем начать

  1. Добавьте Firebase в свой проект C++ .
  2. Получите ключи сервера вашего проекта:
    1. Перейдите на страницу учетных записей служб в настройках вашего проекта.
    2. Нажмите «Создать новый закрытый ключ» в нижней части раздела Firebase Admin SDK на странице «Учетные записи служб» .
    3. Пара открытого и закрытого ключей новой учетной записи службы автоматически сохраняется на вашем компьютере. Скопируйте этот файл на свой сервер аутентификации.

Аутентификация с помощью Firebase

Класс Auth является шлюзом для всех вызовов API.
  1. Добавьте файлы заголовков Auth и App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. В коде инициализации создайте класс 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__)
    
  3. Получите firebase::auth::Auth для вашего firebase::App . Между App и Auth существует взаимно однозначное соответствие.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    
Вызовите Auth::SignInWithCustomToken используя токен с вашего сервера аутентификации.
  1. Когда пользователи входят в ваше приложение, отправляйте свои учетные данные для входа (например, имя пользователя и пароль) на ваш сервер аутентификации. Ваш сервер проверяет учетные данные и возвращает пользовательский токен, если они действительны.
  2. После получения пользовательского токена от вашего сервера аутентификации передайте его в Auth::SignInWithCustomToken для входа пользователя:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomToken(custom_token);
    
  3. Если в вашей программе есть цикл обновления, который выполняется регулярно (скажем, 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();