إدارة المستخدمين في 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.

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

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

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

للحصول على معلومات الملف الشخصي للمستخدم، استخدِم طرق الوصول الخاصة بمثيل 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. على سبيل المثال:

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