مدیریت کاربران در Firebase

ایجاد یک کاربر

برای ایجاد کاربر جدید، گزینه‌های زیر را دارید:

  • از برنامه شما : با فراخوانی متد CreateUserWithEmailAndPassword یا با ورود کاربر برای اولین بار با استفاده از یک ارائه دهنده هویت فدرال، مانند Google Sign-In یا Facebook Login ، یک کاربر جدید در پروژه Firebase خود ایجاد کنید.

  • در کنسول Firebase : یک کاربر جدید با رمز عبور احراز هویت شده در تب Security > Authentication > Users ایجاد کنید.

دریافت کاربر فعلی وارد شده

روش پیشنهادی برای دریافت کاربر فعلی، تنظیم یک شنونده (listener) روی شیء 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 مربوط به کاربر، مقدار false را برمی‌گرداند.

اعتبارنامه کاربر را حفظ کنید

اطلاعات کاربری کاربر پس از ورود به سیستم، در حافظه‌ی کلید محلی ذخیره می‌شود. حافظه‌ی پنهان محلی اطلاعات کاربری را می‌توان با خروج کاربر از سیستم حذف کرد. این حافظه‌ی کلید مختص پلتفرم مورد نظر است:

دریافت پروفایل کاربر

برای دریافت اطلاعات پروفایل یک کاربر، از متدهای accessor یک نمونه از 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();
  }
}

به‌روزرسانی پروفایل کاربر

شما می‌توانید اطلاعات اولیه پروفایل یک کاربر - نام نمایشی کاربر و آدرس اینترنتی عکس پروفایل - را با متد 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 ، در صفحه قالب‌های ایمیل استفاده می‌شود را سفارشی کنید. به بخش قالب‌های ایمیل در مرکز راهنمای فایربیس مراجعه کنید.

تنظیم رمز عبور کاربر

شما می‌توانید رمز عبور کاربر را با استفاده از متد 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);

شما می‌توانید قالب ایمیل مورد استفاده را در تب Security > Authentication > Templates در کنسول 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 در تب Security > Authentication > Users حذف کنید.

احراز هویت مجدد کاربر

برخی از اقدامات حساس به امنیت - مانند حذف حساب کاربری ، تنظیم آدرس ایمیل اصلی و تغییر رمز عبور - مستلزم آن است که کاربر اخیراً وارد سیستم شده باشد. اگر یکی از این اقدامات را انجام دهید و کاربر مدت زیادی پیش وارد سیستم شده باشد، اقدام با شکست مواجه می‌شود.

وقتی این اتفاق می‌افتد، با دریافت اطلاعات ورود جدید از کاربر و ارسال آن به 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);
}

وارد کردن حساب‌های کاربری

شما می‌توانید با استفاده از دستور auth:import در Firebase CLI، حساب‌های کاربری را از یک فایل به پروژه Firebase خود وارد کنید. برای مثال:

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