إدارة المستخدمين في Firebase

قم بإنشاء مستخدم

يمكنك إنشاء مستخدم جديد في مشروع Firebase الخاص بك عن طريق استدعاء طريقة CreateUserWithEmailAndPassword أو عن طريق تسجيل دخول مستخدم لأول مرة باستخدام موفر هوية متحد ، مثل تسجيل الدخول إلى Google أو تسجيل الدخول إلى Facebook .

يمكنك أيضًا إنشاء مستخدمين جدد مصادق عليهم بكلمة مرور من قسم المصادقة في وحدة تحكم 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);

باستخدام مستمع ، فإنك تتأكد من أن كائن المصادقة ليس في حالة وسيطة - مثل التهيئة - عندما تحصل على المستخدم الحالي.

يمكنك أيضًا الحصول على المستخدم الذي قام بتسجيل الدخول حاليًا عن طريق الاتصال current_user . إذا لم يقم المستخدم بتسجيل الدخول ، فسيعيد التابع is_valid التابع للمستخدم إرجاع false.

حافظ على بيانات اعتماد المستخدم

سيتم تخزين بيانات اعتماد المستخدم في مخزن المفاتيح المحلي بعد تسجيل دخول المستخدم. يمكن حذف ذاكرة التخزين المؤقت المحلية لبيانات اعتماد المستخدم عن طريق تسجيل خروج المستخدم. Keystore هو نظام أساسي محدد:

احصل على ملف تعريف المستخدم

للحصول على معلومات ملف تعريف المستخدم ، استخدم طرق الوصول لمثيل 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);
}

يمكنك تخصيص قالب البريد الإلكتروني المستخدم في قسم المصادقة بوحدة تحكم Firebase في صفحة قوالب البريد الإلكتروني. راجع قوالب البريد الإلكتروني في مركز مساعدة 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 الخاص بـ Firebase CLI. على سبيل المثال:

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