Вы можете использовать Firebase Authentication , чтобы позволить пользователям аутентифицироваться в Firebase, используя свои адреса электронной почты и пароли, а также для управления учетными записями вашего приложения, основанными на паролях.
Прежде чем начать
- Добавьте Firebase в свой проект на C++ .
- Если вы еще не подключили свое приложение к проекту Firebase, сделайте это через консоль Firebase .
- Включите вход по электронной почте и паролю:
- В консоли Firebase откройте раздел «Аутентификация» .
- На вкладке «Способ входа» выберите способ входа по электронной почте/паролю и нажмите «Сохранить» .
Получите доступ к классу 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);
Создайте учетную запись на основе пароля.
Чтобы создать новую учетную запись пользователя с паролем, выполните следующие действия в коде входа в ваше приложение:
- Когда новый пользователь регистрируется через форму регистрации вашего приложения, выполните все необходимые шаги проверки учетной записи, например, убедитесь, что пароль новой учетной записи введен правильно и соответствует вашим требованиям к сложности.
- Создайте новую учетную запись, передав адрес электронной почты и пароль нового пользователя в
Auth::CreateUserWithEmailAndPassword:firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPassword(email, password);
- Если в вашей программе есть цикл обновления, который выполняется регулярно (например, 30 или 60 раз в секунду), вы можете проверять результаты после каждого обновления с помощью
Auth::CreateUserWithEmailAndPasswordLastResult: Или, если ваша программа основана на событиях, вы можете предпочесть зарегистрировать обратный вызов в Future .firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { const firebase::auth::AuthResult auth_result = *result.result(); printf("Create user succeeded for email %s\n", auth_result.user.email().c_str()); } else { printf("Created user failed with error '%s'\n", result.error_message()); } }
Войдите в систему, используя адрес электронной почты и пароль.
Процедура входа пользователя в систему с помощью пароля аналогична процедуре создания новой учетной записи. В функции входа в систему вашего приложения выполните следующие действия:
- Когда пользователь входит в ваше приложение, передайте адрес электронной почты и пароль пользователя в
firebase::auth::Auth::SignInWithEmailAndPassword:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPassword(email, password);
- Если в вашей программе есть цикл обновления, который выполняется регулярно (например, 30 или 60 раз в секунду), вы можете проверять результаты после каждого обновления с помощью
Auth::SignInWithEmailAndPasswordLastResult: Или, если ваша программа основана на событиях, вы можете предпочесть зарегистрировать обратный вызов в Future .firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPasswordLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { const firebase::auth::AuthResult auth_result = *result.result(); printf("Sign in succeeded for email %s\n", auth_result.user.email().c_str()); } else { printf("Sign in failed with error '%s'\n", result.error_message()); } }
Зарегистрируйте обратный вызов в Future
В некоторых программах есть функции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 Authentication поддерживают следующие требования к паролям:
Требуется символ нижнего регистра
Требуется заглавная буква
Требуется числовой символ
Требуется небуквенно-цифровой символ.
Следующие символы удовлетворяют требованию к небуквенно-цифровым символам:
^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~Минимальная длина пароля (от 6 до 30 символов; по умолчанию — 6).
Максимальная длина пароля (4096 символов)
Вы можете включить принудительное применение политики паролей в двух режимах:
Требование : Попытки регистрации завершаются неудачей, пока пользователь не обновит свой пароль, используя пароль, соответствующий вашей политике.
Уведомление : Пользователям разрешается регистрироваться с не соответствующим требованиям паролем. При использовании этого режима следует проверить, соответствует ли пароль пользователя политике безопасности на стороне клиента, и каким-либо образом предложить пользователю обновить пароль, если он не соответствует требованиям.
Новым пользователям всегда необходимо выбирать пароль, соответствующий вашей политике.
Если у вас есть активные пользователи, мы рекомендуем не включать принудительное обновление при входе в систему, если вы не собираетесь блокировать доступ пользователям, чьи пароли не соответствуют вашей политике. Вместо этого используйте режим уведомления, который позволяет пользователям входить в систему со своими текущими паролями и информирует их о несоответствии их паролю требуемым параметрам.
Рекомендуется: включить защиту от перечисления адресов электронной почты.
Некоторые методы Firebase Authentication , принимающие адреса электронной почты в качестве параметров, выдают определенные ошибки, если адрес электронной почты не зарегистрирован, когда он должен быть зарегистрирован (например, при входе в систему с помощью адреса электронной почты и пароля), или зарегистрирован, когда он не используется (например, при изменении адреса электронной почты пользователя). Хотя это может быть полезно для предложения конкретных решений пользователям, это также может быть использовано злоумышленниками для получения адресов электронной почты, зарегистрированных вашими пользователями.
Чтобы снизить этот риск, мы рекомендуем включить защиту от перечисления адресов электронной почты для вашего проекта с помощью инструмента Google Cloud gcloud . Обратите внимание, что включение этой функции изменяет поведение Firebase Authentication в отношении сообщений об ошибках: убедитесь, что ваше приложение не зависит от более специфических ошибок.
Следующие шаги
После первого входа пользователя в систему создается новая учетная запись, которая связывается с учетными данными — то есть именем пользователя и паролем, номером телефона или информацией о поставщике аутентификации, — которые пользователь использовал для входа. Эта новая учетная запись хранится в рамках вашего проекта 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();