إدارة المستخدمين في 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 الخاصة بالمستخدم القيمة "خطأ".

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

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

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

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