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

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

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

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

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

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

للحصول على معلومات الملف الشخصي للمستخدم، استخدم أساليب الوصول لمثيل 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