Uwierzytelnianie Firebase pozwala użytkownikom na uwierzytelnianie w Firebase za pomocą ich adresów e-mail i haseł oraz do zarządzania kontami opartymi na hasłach w aplikacji.
Zanim zaczniesz
- Dodaj Firebase do projektu C++.
- Jeśli Twoja aplikacja nie jest jeszcze połączona z projektem Firebase, możesz to zrobić z poziomu konsoli Firebase.
- Włącz logowanie za pomocą adresu e-mail/hasła:
- W konsoli Firebase otwórz sekcję Uwierzytelnianie.
- Na karcie Metoda logowania włącz metodę logowania E-mail/hasło i kliknij Zapisz.
Uzyskaj dostęp do zajęć firebase::auth::Auth
Klasa Auth
jest bramą dla wszystkich wywołań interfejsu API.
- Dodaj pliki nagłówka uwierzytelniania i aplikacji:
#include "firebase/app.h" #include "firebase/auth.h"
- W kodzie inicjowania utwórz klasę
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__)
- Uzyskaj zajęcia
firebase::auth::Auth
związane z urządzeniemfirebase::App
. MiędzyApp
aAuth
występuje mapowanie 1:1.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Tworzenie konta opartego na haśle
Aby utworzyć nowe konto użytkownika z hasłem, wykonaj te czynności w kodzie logowania do aplikacji:
- Gdy nowy użytkownik rejestruje się za pomocą formularza rejestracyjnego w Twojej aplikacji, wykonaj wszystkie wymagane przez aplikację kroki weryfikacji konta, np. sprawdź, czy hasło do nowego konta jest wpisane prawidłowo i czy spełnia wymagania Twojej firmy.
- Utwórz nowe konto, przesyłając jego adres e-mail i hasło
na adres
Auth::CreateUserWithEmailAndPassword
:firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPassword(email, password);
- Jeśli Twój program ma pętlę aktualizacji, która uruchamia się regularnie (np. 30 lub 60 razy na sekundę), możesz sprawdzać wyniki raz na aktualizację za pomocą
Auth::CreateUserWithEmailAndPasswordLastResult
: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()); } }
Jeśli Twój program jest oparty na zdarzeniach, możesz zarejestrować się oddzwonienie w przyszłości.
Logowanie użytkownika za pomocą adresu e-mail i hasła
Procedura logowania użytkownika za pomocą hasła jest podobna do procedury tworzenia nowego konta. W funkcji logowania w aplikacji wykonaj te czynności:
- Gdy użytkownik zaloguje się w Twojej aplikacji, przekaż jego adres e-mail i hasło do
firebase::auth::Auth::SignInWithEmailAndPassword
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithEmailAndPassword(email, password);
- Jeśli Twój program ma pętlę aktualizacji, która uruchamia się regularnie (np. 30 lub 60 razy na sekundę), możesz sprawdzać wyniki raz na aktualizację za pomocą
Auth::SignInWithEmailAndPasswordLastResult
: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()); } }
Jeśli Twój program jest oparty na zdarzeniach, możesz zarejestrować się oddzwonienie w przyszłości.
Rejestrowanie oddzwonienia w przyszłości
Niektóre programy mają funkcjeUpdate
, które są wywoływane 30 lub 60 razy na sekundę.
Na przykład wiele gier korzysta z tego modelu. Programy te mogą wywoływać funkcje LastResult
, aby sondować wywołania asynchroniczne.
Jeśli jednak Twój program jest oparty na zdarzeniach, możesz zarejestrować funkcje wywołań zwrotnych.
Funkcja wywołania zwrotnego jest wywoływana po zakończeniu okresu przyszłego.
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); }Jeśli wolisz, funkcja wywołania zwrotnego może też być lambdą.
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); }
Zalecane: włącz ochronę wyliczania e-maili
Niektóre metody uwierzytelniania Firebase, które przyjmują adresy e-mail jako parametry, powodują wystąpienie błędów, jeśli adres e-mail nie jest zarejestrowany, gdy trzeba go zarejestrować (np. podczas logowania się za pomocą adresu e-mail i hasła), lub rejestruje, gdy musi być nieużywany (np. podczas zmiany adresu e-mail użytkownika). Może to być pomocne przy podpowiadaniu użytkownikom konkretnych środków zaradczych. Może też być wykorzystywane przez nieuczciwe podmioty do wykrycia adresów e-mail zarejestrowanych przez użytkowników.
Aby ograniczyć to ryzyko, zalecamy włączenie w projekcie ochrony przed wyliczeniem adresów e-mail za pomocą narzędzia Google Cloud gcloud
. Pamiętaj, że włączenie tej funkcji zmienia sposób raportowania błędów Uwierzytelniania Firebase: dopilnuj, aby aplikacja nie korzystała z bardziej szczegółowych błędów.
Dalsze kroki
Gdy użytkownik loguje się po raz pierwszy, tworzone jest nowe konto użytkownika, które jest łączone z danymi logowania (nazwa użytkownika i hasło, numer telefonu lub informacje o dostawcy uwierzytelniania). Nowe konto jest przechowywane w ramach Twojego projektu Firebase i może być używane do identyfikowania użytkowników we wszystkich aplikacjach w Twoim projekcie niezależnie od tego, jak się on loguje.
-
W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu
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(); }
W regułach zabezpieczeń Bazy danych czasu rzeczywistego Firebase i Cloud Storage możesz pobrać ze zmiennej
auth
unikalny identyfikator użytkownika zalogowanego użytkownika i użyć go do kontrolowania, do jakich danych użytkownik ma dostęp.
Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu różnych dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj
SignOut()
:
auth->SignOut();