مدیریت کاربران در 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();
  }
}

به‌روزرسانی نمایه کاربر

می‌توانید اطلاعات نمایه پایه کاربر—نام نمایشی کاربر و نشانی وب عکس نمایه—را با روش 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);
}

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

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

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