จัดการผู้ใช้ใน Firebase

สร้างผู้ใช้

คุณมีตัวเลือกในการสร้างผู้ใช้ใหม่ดังนี้

  • จากแอป: สร้างผู้ใช้ใหม่ในโปรเจ็กต์ Firebase โดยเรียกใช้เมธอด createUserWithEmailAndPassword() หรือลงชื่อเข้าใช้ผู้ใช้เป็น ครั้งแรกโดยใช้ผู้ให้บริการข้อมูลประจำตัวแบบรวม, เช่น การลงชื่อเข้าใช้ด้วยบัญชี Google, การเข้าสู่ระบบด้วย Facebook หรือ Apple

  • ในคอนโซลFirebase : สร้างผู้ใช้ที่ตรวจสอบสิทธิ์ด้วยรหัสผ่านใหม่ ในแท็บความปลอดภัย > การตรวจสอบสิทธิ์ > ผู้ใช้

ดูโปรไฟล์ของผู้ใช้

หากต้องการดูข้อมูลโปรไฟล์ของผู้ใช้ ให้ใช้พร็อพเพอร์ตี้ของ User โดยมี 3 วิธีในการรับออบเจ็กต์ User ที่แสดงผู้ใช้ปัจจุบัน

  • สตรีม authStateChanges, idTokenChanges และ userChanges: ผู้ฟังจะได้รับ User ปัจจุบัน หรือ null หากไม่มีผู้ใช้ที่ได้รับการตรวจสอบสิทธิ์

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

    เมื่อแอปเริ่มต้น ระบบจะทริกเกอร์เหตุการณ์หลังจากกู้คืนข้อมูลเข้าสู่ระบบของผู้ใช้ (หากมี) จากพื้นที่เก็บข้อมูลในเครื่อง ซึ่งหมายความว่าระบบจะเรียกผู้ฟังทุกครั้งที่เริ่มต้นสถานะผู้ใช้ จากนั้น เมื่อใดก็ตามที่สถานะการตรวจสอบสิทธิ์เปลี่ยนแปลง ระบบจะยกเหตุการณ์ใหม่ที่มีสถานะผู้ใช้ที่อัปเดต

    การฟังสถานะการตรวจสอบสิทธิ์จะช่วยให้คุณสร้างอินเทอร์เฟซผู้ใช้ที่ตอบสนองต่อการเปลี่ยนแปลงสถานะการตรวจสอบสิทธิ์เหล่านี้ได้ อย่าวาง authStateChanges().listen(...) ไว้ในเมธอดสร้างของวิดเจ็ตโดยตรง เนื่องจากจะสร้างการสมัครใช้บริการใหม่ทุกครั้งที่สร้างใหม่ หากต้องการอัปเดต UI เพื่อตอบสนองต่อสถานะการตรวจสอบสิทธิ์ ให้ใช้ 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: หากมั่นใจว่าผู้ใช้ลงชื่อเข้าใช้อยู่ในขณะนี้ คุณสามารถเข้าถึง User จากพร็อพเพอร์ตี้ currentUser ได้

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

    currentUser อาจเป็น null ได้ด้วย 2 เหตุผลต่อไปนี้

    • ผู้ใช้ไม่ได้ลงชื่อเข้าใช้
    • ออบเจ็กต์การตรวจสอบสิทธิ์ยังเริ่มต้นไม่เสร็จ หากใช้ผู้ฟังเพื่อติดตามสถานะการลงชื่อเข้าใช้ของผู้ใช้ คุณไม่จำเป็นต้องจัดการกรณีนี้

ดูข้อมูลโปรไฟล์ของผู้ใช้ที่เฉพาะเจาะจงของผู้ให้บริการ

หากต้องการดูข้อมูลโปรไฟล์ที่ดึงมาจากผู้ให้บริการลงชื่อเข้าใช้ที่ลิงก์กับผู้ใช้ ให้ใช้พร็อพเพอร์ตี้ 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;
    }
}

อัปเดตโปรไฟล์ของผู้ใช้

คุณสามารถอัปเดตข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ ซึ่งได้แก่ ชื่อที่แสดง และ URL รูปโปรไฟล์ โดยใช้เมธอด 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();

คุณสามารถปรับแต่งเทมเพลตอีเมลที่จะใช้ได้ในแท็บ ความปลอดภัย > การตรวจสอบสิทธิ์ > เทมเพลต ของคอนโซลFirebase ดู หัวข้อเทมเพลตอีเมลใน ศูนย์ช่วยเหลือของ Firebase

นอกจากนี้ คุณยังส่งต่อสถานะผ่าน URL ต่อได้เพื่อเปลี่ยนเส้นทางกลับ ไปยังแอปเมื่อส่งอีเมลยืนยัน

อีกทั้งยังแปลอีเมลยืนยันเป็นภาษาท้องถิ่นได้ด้วยการอัปเดตรหัสภาษาในอินสแตนซ์การตรวจสอบสิทธิ์ก่อนส่งอีเมล เช่น

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

ตั้งค่ารหัสผ่านของผู้ใช้

คุณสามารถตั้งค่ารหัสผ่านของผู้ใช้ด้วยเมธอด updatePassword() เช่น

await user?.updatePassword(newPassword);

ส่งอีเมลรีเซ็ตรหัสผ่าน

คุณสามารถส่งอีเมลรีเซ็ตรหัสผ่านให้ผู้ใช้ด้วยเมธอด sendPasswordResetEmail() เช่น

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

คุณสามารถปรับแต่งเทมเพลตอีเมลที่จะใช้ได้ในแท็บ ความปลอดภัย > การตรวจสอบสิทธิ์ > เทมเพลต ของคอนโซลFirebase ดู หัวข้อเทมเพลตอีเมลใน ศูนย์ช่วยเหลือของ Firebase

นอกจากนี้ คุณยังส่งต่อสถานะผ่าน URL ต่อได้เพื่อเปลี่ยนเส้นทางกลับ ไปยังแอปเมื่อส่งอีเมลรีเซ็ตรหัสผ่าน

อีกทั้งยังแปลอีเมลรีเซ็ตรหัสผ่านเป็นภาษาท้องถิ่นได้ด้วยการอัปเดตรหัสภาษาในอินสแตนซ์การตรวจสอบสิทธิ์ก่อนส่งอีเมล เช่น

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

นอกจากนี้ คุณยังส่งอีเมลรีเซ็ตรหัสผ่านจากคอนโซล Firebase ได้ด้วย

ลบผู้ใช้

คุณสามารถลบบัญชีผู้ใช้ด้วยเมธอด delete() เช่น

await user?.delete();

นอกจากนี้ คุณยังลบผู้ใช้ในคอนโซลFirebase ได้ในแท็บ ความปลอดภัย > การตรวจสอบสิทธิ์ > ผู้ใช้

ตรวจสอบสิทธิ์ผู้ใช้ซ้ำ

การดำเนินการบางอย่างที่ละเอียดอ่อนด้านความปลอดภัย เช่น การลบบัญชี, การตั้งค่าอีเมลหลัก และ การเปลี่ยนรหัสผ่าน กำหนดให้ผู้ใช้ต้อง ลงชื่อเข้าใช้เมื่อไม่นานมานี้ หากคุณดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้ และผู้ใช้ลงชื่อเข้าใช้นานเกินไป การดำเนินการจะล้มเหลวและแสดง 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);

นำเข้าบัญชีผู้ใช้

คุณสามารถนำเข้าบัญชีผู้ใช้จากไฟล์ไปยังโปรเจ็กต์ Firebase ได้โดยใช้ คำสั่ง auth:import ของ Firebase CLI เช่น

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