ניהול משתמשים ב-Firebase

יצירת משתמש

יוצרים משתמש חדש בפרויקט Firebase באמצעות קריאה CreateUserWithEmailAndPassword או על ידי כניסה של משתמש בפעם הראשונה באמצעות זהות מאוחדת ספק, כמו כניסה באמצעות חשבון Google או התחברות ל-Facebook.

אפשר גם ליצור משתמשים חדשים שמאומתים באמצעות סיסמה בקטע Authentication (אימות) בדף Users (משתמשים) במסוף Firebase.

איתור המשתמש שמחובר כרגע

הדרך המומלצת לקבל את המשתמש הנוכחי היא להגדיר מאזין באובייקט Auth:

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);

שימוש ב-listener מבטיח שאובייקט האימות לא נמצא בשלב הביניים במצב הזה - כמו אתחול, כשמקבלים את המשתמש הנוכחי.

אפשר גם להתקשר למספר current_user כדי למצוא את המשתמש שמחובר כרגע. אם אם המשתמש לא מחובר לחשבון, השיטה is_valid של המשתמש תחזיר את הערך False.

שמירה על פרטי הכניסה של המשתמש

פרטי הכניסה של המשתמש יישמרו במאגר המפתחות המקומי אחרי שהמשתמש מחובר. ניתן למחוק את המטמון המקומי של פרטי כניסה של משתמשים באמצעות חתימה את המשתמש החוצה. מאגר המפתחות הוא ספציפי לפלטפורמה:

טעינת פרופיל של משתמש

כדי לקבל את פרטי הפרופיל של משתמש, משתמשים בשיטות הגישה של מכונה של 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();
}

אחזור פרטי הפרופיל של משתמש שספציפיים לספק

כדי לקבל את פרטי הפרופיל שאוחזרו מספקי הכניסה שמקושרים אל משתמש, צריך להשתמש בשיטה ProviderData. לדוגמה:

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();
  }
}

עדכון פרופיל של משתמש

אפשר לעדכן את פרטי הפרופיל הבסיסיים של משתמש – השם המוצג של המשתמש וכתובת ה-URL של תמונת הפרופיל – באמצעות השיטה UpdateUserProfile. לדוגמה:

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.
}

איך מגדירים כתובת אימייל של משתמש

אפשר להגדיר כתובת אימייל של משתמש באמצעות השיטה UpdateEmail. לדוגמה:

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);
}

שליחת הודעת אימות למשתמש

אפשר לשלוח אימייל לאימות כתובת למשתמש עם אמצעי תשלום אחד (SendEmailVerification). לדוגמה:

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);
}

אפשר להתאים אישית את תבנית האימייל שמשמשת בקטע Authentication (אימות) במסוף Firebase, בדף Email Templates (תבניות אימייל). מידע נוסף זמין במאמר תבניות אימייל במרכז העזרה של Firebase.

איך מגדירים סיסמה למשתמש

אפשר להגדיר סיסמה של משתמש באמצעות השיטה UpdatePassword. לדוגמה:

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);
}

שליחת אימייל לאיפוס הסיסמה

אפשר לשלוח אימייל לאיפוס הסיסמה למשתמש באמצעות השיטה SendPasswordResetEmail. לדוגמה:

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);

אפשר להתאים אישית את תבנית האימייל שבה נעשה שימוש בקטע 'אימות' ב- במסוף Firebase, בדף 'תבניות אימייל'. מידע נוסף זמין במאמר תבניות אימייל במרכז העזרה של Firebase.

אפשר גם לשלוח אימיילים לאיפוס סיסמה מהמסוף Firebase.

מחיקת משתמש

אפשר למחוק חשבון משתמש באמצעות השיטה Delete. לדוגמה:

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);
}

אפשר למחוק משתמשים גם מהקטע 'אימות' של מסוף Firebase, בדף 'משתמשים'.

אימות מחדש של משתמש

כדי לבצע פעולות מסוימות שקשורות לאבטחה, כמו מחיקת חשבון, הגדרת כתובת אימייל ראשית ושינוי סיסמה, המשתמש צריך להיכנס לחשבון לאחרונה. אם ביצעתם אחת מהפעולות האלה, והמשתמש נכנס לחשבון לפני יותר מדי זמן, הפעולה נכשלת.

במקרה כזה, מבצעים אימות מחדש של המשתמש על ידי קבלת פרטי כניסה חדשים מהמשתמש והעברת פרטי הכניסה אל Reauthenticate. לדוגמה:

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);
}

ייבוא חשבונות משתמשים

אפשר לייבא חשבונות משתמשים מקובץ לפרויקט Firebase באמצעות הפקודה auth:import ב-CLI של Firebase. לדוגמה:

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14