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

สร้างผู้ใช้

คุณสร้างผู้ใช้ใหม่ในโปรเจ็กต์ Firebase ได้ 4 วิธี ดังนี้

นอกจากนี้ คุณยังสามารถสร้างผู้ใช้ที่ตรวจสอบสิทธิ์ด้วยรหัสผ่านใหม่ได้จากการตรวจสอบสิทธิ์ ของคอนโซล Firebase ในหน้าผู้ใช้

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

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

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

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

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

    คุณจะสร้างอินเทอร์เฟซผู้ใช้ที่ ตอบสนองต่อการเปลี่ยนแปลงเหล่านี้ในสถานะการตรวจสอบสิทธิ์

  • ออบเจ็กต์ UserCredential ที่แสดงผลโดยการตรวจสอบสิทธิ์ (signIn-) Method: ออบเจ็กต์ 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 ข้อดังนี้

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

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

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