Create a user
You create a new user in your Firebase project by calling the
CreateUserWithEmailAndPassword
method or by signing in a user for the first time using a federated identity
provider, such as
Google Sign-In
or
Facebook Login
.
You can also create new password-authenticated users from the Authentication
section of the
Firebase console
, on the Users page.
Get the currently signed-in user
The recommended way to get the current user is by setting a listener on the
Auth object:
class MyAuthStateListener : public firebase::auth::AuthStateListener {
public:
void OnAuthStateChanged(firebase::auth::Auth* auth) override {
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
// User is signed in
printf("OnAuthStateChanged: signed_in %s\n", user.uid().c_str());
} else {
// User is signed out
printf("OnAuthStateChanged: signed_out\n");
}
// ...
}
};
// ... initialization code
// Test notification on registration.
MyAuthStateListener state_change_listener;
auth->AddAuthStateListener(&state_change_listener);
By using a listener, you ensure that the Auth object isn't in an intermediate
state—such as initialization—when you get the current user.
You can also get the currently signed-in user by calling
current_user
. If a
user isn't signed in, the user's
is_valid
method will return false.
Persist a user's credential
The user's credentials will be stored in the local keystore after a user
is signed in. The local cache of user credentials can be deleted by signing
the user out. The keystore is platform specific:
Get a user's profile
To get a user's profile information, use the accessor methods of an instance of
firebase::auth::User
. For example:
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();
}
To get the profile information retrieved from the sign-in providers linked to a
user, use the
ProviderData
method. For example:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
for (auto it = user.provider_data().begin();
it != user.provider_data().end(); ++it) {
firebase::auth::UserInfoInterface profile = *it;
// Id of the provider (ex: google.com)
std::string providerId = profile.provider_id();
// UID specific to the provider
std::string uid = profile.uid();
// Name, email address, and profile photo Url
std::string name = profile.display_name();
std::string email = profile.email();
std::string photoUrl = profile.photo_url();
}
}
Update a user's profile
You can update a user's basic profile information—the user's display name
and profile photo URL—with the
UpdateUserProfile
method. For example:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::auth::User::UserProfile profile;
profile.display_name = "Jane Q. User";
profile.photo_url = "https://example.com/jane-q-user/profile.jpg";
user.UpdateUserProfile(profile).OnCompletion(
[](const firebase::Future<void>& completed_future, void* user_data) {
// We are probably in a different thread right now.
if (completed_future.error() == 0) {
printf("User profile updated.");
}
},
nullptr); // pass user_data here.
}
Set a user's email address
You can set a user's email address with the
UpdateEmail
method. For example:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
user.UpdateEmail("user@example.com")
.OnCompletion(
[](const firebase::Future<void>& completed_future,
void* user_data) {
// We are probably in a different thread right now.
if (completed_future.error() == 0) {
printf("User email address updated.");
}
},
nullptr);
}
Send a user a verification email
You can send an address verification email to a user with the
SendEmailVerification
method. For example:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
user.SendEmailVerification().OnCompletion(
[](const firebase::Future<void>& completed_future, void* user_data) {
// We are probably in a different thread right now.
if (completed_future.error() == 0) {
printf("Email sent.");
}
},
nullptr);
}
You can customize the email template that is used in Authentication section of
the
Firebase console
, on the Email Templates page.
See
Email Templates
in
Firebase Help Center.
Set a user's password
You can set a user's password with the
UpdatePassword
method. For example:
firebase::auth::User user = auth->current_user();
std::string newPassword = "SOME-SECURE-PASSWORD";
if (user.is_valid()) {
user.UpdatePassword(newPassword.c_str())
.OnCompletion(
[](const firebase::Future<void>& completed_future,
void* user_data) {
// We are probably in a different thread right now.
if (completed_future.error() == 0) {
printf("password updated.");
}
},
nullptr);
}
Send a password reset email
You can send a password reset email to a user with the
SendPasswordResetEmail
method. For example:
std::string emailAddress = "user@example.com";
auth->SendPasswordResetEmail(emailAddress.c_str())
.OnCompletion(
[](const firebase::Future<void>& completed_future,
void* user_data) {
// We are probably in a different thread right now.
if (completed_future.error() == 0) {
// Email sent.
} else {
// An error happened.
printf("Error %d: %s", completed_future.error(),
completed_future.error_message());
}
},
nullptr);
You can customize the email template that is used in Authentication section of
the
Firebase console
, on the Email Templates page.
See
Email Templates
in
Firebase Help Center.
You can also send password reset emails from the Firebase console.
Delete a user
You can delete a user account with the
Delete
method. For example:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
user.Delete().OnCompletion(
[](const firebase::Future<void>& completed_future, void* user_data) {
if (completed_future.error() == 0) {
// User deleted.
} else {
// An error happened.
printf("Error %d: %s", completed_future.error(),
completed_future.error_message());
}
},
nullptr);
}
You can also delete users from the Authentication section of the
Firebase console
, on the Users page.
Re-authenticate a user
Some security-sensitive actions—such as
deleting an account
,
setting a primary email address
, and
changing a password
—require that the user has
recently signed in. If you perform one of these actions, and the user signed in
too long ago, the action fails.
When this happens, re-authenticate the user by getting new sign-in credentials
from the user and passing the credentials to
Reauthenticate
. For example:
firebase::auth::User user = auth->current_user();
// Get auth credentials from the user for re-authentication. The example
// below shows email and password credentials but there are multiple
// possible providers, such as GoogleAuthProvider or FacebookAuthProvider.
firebase::auth::Credential credential =
firebase::auth::EmailAuthProvider::GetCredential("user@example.com",
"password1234");
if (user.is_valid()) {
user.Reauthenticate(credential)
.OnCompletion(
[](const firebase::Future<void>& completed_future,
void* user_data) {
if (completed_future.error() == 0) {
printf("User re-authenticated.");
}
},
nullptr);
}
Import user accounts
You can import user accounts from a file into your Firebase project by using the
Firebase CLI's
auth:import
command. For example:
firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14