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

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

شما به چهار روش می‌توانید یک کاربر جدید در پروژه Firebase خود ایجاد کنید:

  • متد createUserWithEmailAndPassword() را فراخوانی کنید.
  • برای اولین بار با استفاده از یک ارائه‌دهنده هویت فدرال ، مانند ورود به سیستم گوگل، ورود به سیستم فیس‌بوک یا اپل، یک کاربر وارد سیستم شود.

همچنین می‌توانید از بخش احراز هویت (Authentication) کنسول فایربیس در صفحه کاربران، کاربران جدید احراز هویت شده با رمز عبور ایجاد کنید.

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

برای دریافت اطلاعات پروفایل کاربر، از ویژگی‌های User استفاده کنید. سه راه برای دریافت یک شیء User که نشان دهنده کاربر فعلی است وجود دارد:

  • جریان‌های authStateChanges ، idTokenChanges و userChanges : شنونده‌های شما User فعلی را دریافت می‌کنند، یا اگر هیچ کاربری احراز هویت نشده باشد، null می‌کنند:

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

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

    با گوش دادن به وضعیت احراز هویت، می‌توانید یک رابط کاربری بسازید که به این تغییرات در وضعیت احراز هویت واکنش نشان دهد. authStateChanges().listen(...) مستقیماً درون متد build ویجت قرار ندهید، زیرا در هر بازسازی یک اشتراک جدید ایجاد می‌کند. اگر نیاز دارید که رابط کاربری را در پاسخ به وضعیت احراز هویت به‌روزرسانی کنید، از StreamBuilder استفاده کنید:

    StreamBuilder<User?>(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
      if (snapshot.hasError) {
        return const Text('Something went wrong');
      }
    
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text("Loading...");
      }
    
      if (!snapshot.hasData) {
        return const SignInScreen();
      }
    
      final user = snapshot.data!;
      return HomeScreen(userId: user.uid);
    },
    )
    

    این رویکرد تضمین می‌کند که درخت ویجت هنگام تغییر وضعیت احراز هویت کاربر، به‌طور خودکار بازسازی شود.

  • شیء UserCredential که توسط متدهای احراز هویت ( signIn -) برگردانده می‌شود: شیء UserCredential دارای یک ویژگی user با User فعلی است:

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • ویژگی currentUser از نمونه FirebaseAuth : اگر مطمئن هستید که کاربر در حال حاضر وارد سیستم شده است، می‌توانید از ویژگی currentUser به User دسترسی پیدا کنید:

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    currentUser به دو دلیل می‌تواند null باشد:

    • کاربر وارد سیستم نشده است.
    • شیء auth مقداردهی اولیه را تمام نکرده است. اگر از یک شنونده برای پیگیری وضعیت ورود کاربر استفاده می‌کنید، نیازی به رسیدگی به این مورد ندارید.

اطلاعات پروفایل مختص ارائه‌دهنده‌ی خدمات کاربر را دریافت کنید

برای دریافت اطلاعات پروفایل بازیابی شده از ارائه دهندگان ورود به سیستم مرتبط با یک کاربر، از ویژگی providerData استفاده کنید. برای مثال:

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

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

شما می‌توانید اطلاعات اولیه پروفایل یک کاربر - نام نمایشی کاربر و آدرس اینترنتی عکس پروفایل - را با استفاده از متدهای update - به‌روزرسانی کنید. برای مثال:

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

تنظیم آدرس ایمیل کاربر

شما می‌توانید آدرس ایمیل کاربر را با متد updateEmail() تنظیم کنید. برای مثال:

await user?.updateEmail("janeq@example.com");

ارسال ایمیل تأیید به کاربر

شما می‌توانید با استفاده از متد sendEmailVerification() یک ایمیل تأیید آدرس برای کاربر ارسال کنید. برای مثال:

await user?.sendEmailVerification();

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

همچنین می‌توان هنگام ارسال ایمیل تأیید، وضعیت را از طریق یک URL ادامه‌دار ارسال کرد تا به برنامه هدایت شود.

علاوه بر این، می‌توانید ایمیل تأیید را با به‌روزرسانی کد زبان در نمونه Auth قبل از ارسال ایمیل، بومی‌سازی کنید. برای مثال:

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

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

شما می‌توانید رمز عبور کاربر را با استفاده از متد updatePassword() تنظیم کنید. برای مثال:

await user?.updatePassword(newPassword);

ارسال ایمیل تنظیم مجدد رمز عبور

شما می‌توانید با استفاده از متد sendPasswordResetEmail() یک ایمیل تنظیم مجدد رمز عبور برای کاربر ارسال کنید. برای مثال:

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

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

همچنین می‌توان هنگام ارسال ایمیل تنظیم مجدد رمز عبور، وضعیت را از طریق یک URL ادامه‌دار ارسال کرد تا به برنامه هدایت شود.

علاوه بر این، می‌توانید ایمیل تنظیم مجدد رمز عبور را با به‌روزرسانی کد زبان در نمونه Auth قبل از ارسال ایمیل، بومی‌سازی کنید. برای مثال:

await FirebaseAuth.instance.setLanguageCode("fr");

همچنین می‌توانید ایمیل‌های تنظیم مجدد رمز عبور را از کنسول Firebase ارسال کنید.

حذف یک کاربر

شما می‌توانید با استفاده از متد delete() یک حساب کاربری را حذف کنید. برای مثال:

await user?.delete();

همچنین می‌توانید کاربران را از بخش احراز هویت (Authentication) کنسول فایربیس ، در صفحه کاربران (Users) حذف کنید.

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

برخی از اقدامات حساس به امنیت - مانند حذف حساب کاربری ، تنظیم آدرس ایمیل اصلی و تغییر رمز عبور - مستلزم آن است که کاربر اخیراً وارد سیستم شده باشد. اگر یکی از این اقدامات را انجام دهید و کاربر مدت زیادی از ورود او گذشته باشد، اقدام با شکست مواجه می‌شود و خطای FirebaseAuthException با کد requires-recent-login رخ می‌دهد. در این صورت، با دریافت اعتبارنامه‌های ورود جدید از کاربر و ارسال اعتبارنامه‌ها برای reauthenticate ، کاربر را مجدداً احراز هویت کنید. برای مثال:

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

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

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

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