ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ลิงก์อีเมล

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

การลงชื่อเข้าใช้ทางอีเมลมีประโยชน์หลายประการดังนี้

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

ก่อนเริ่มต้น

  1. หากยังไม่ได้ดำเนินการ ให้ทำตามขั้นตอนในคู่มือเริ่มต้นใช้งาน

  2. เปิดใช้การลงชื่อเข้าใช้ลิงก์อีเมลสำหรับโปรเจ็กต์ Firebase ของคุณ

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

    1. ในคอนโซล Firebase ให้เปิดส่วนการตรวจสอบสิทธิ์
    2. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการอีเมล/รหัสผ่าน โปรดทราบว่าจะต้องเปิดใช้การลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่านเพื่อใช้ลิงก์อีเมล การลงชื่อเข้าใช้
    3. ในส่วนเดียวกัน ให้เปิดใช้ลิงก์อีเมล (ลงชื่อเข้าใช้แบบไม่ต้องใช้รหัสผ่าน) วิธีลงชื่อเข้าใช้
    4. คลิกบันทึก

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

  1. สร้างออบเจ็กต์ ActionCodeSettings ซึ่งจะให้คำแนะนำวิธีการสร้างลิงก์อีเมลแก่ Firebase ตั้งค่าฟิลด์ต่อไปนี้:

    • url: Deep Link ที่จะฝังและสถานะเพิ่มเติมที่จะส่งต่อ โดเมนของลิงก์ต้องได้รับอนุญาตพิเศษในรายการโดเมนที่ได้รับอนุญาตในคอนโซล Firebase ซึ่งดูได้โดยไปที่แท็บวิธีการลงชื่อเข้าใช้ (การตรวจสอบสิทธิ์ -> วิธีการลงชื่อเข้าใช้) ลิงก์จะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL นี้ หากไม่ได้ติดตั้งแอปไว้ในอุปกรณ์ของผู้ใช้และไม่สามารถติดตั้งแอปได้

    • androidPackageName และ IOSBundleId: แอปที่จะใช้เมื่อเปิดลิงก์ลงชื่อเข้าใช้ในอุปกรณ์ Android หรือ iOS ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่าลิงก์แบบไดนามิกของ Firebase เพื่อเปิดลิงก์การดำเนินการทางอีเมลผ่านแอปบนอุปกรณ์เคลื่อนที่

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

    • dynamicLinkDomain: เมื่อมีการกำหนดโดเมนลิงก์แบบไดนามิกที่กำหนดเองหลายโดเมนสำหรับโปรเจ็กต์ ให้ระบุโดเมนที่จะใช้เมื่อมีการเปิดลิงก์ผ่านแอปบนอุปกรณ์เคลื่อนที่ที่ระบุ (เช่น example.page.link) มิฉะนั้นระบบจะเลือกโดเมนแรกโดยอัตโนมัติ

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. ขออีเมลของผู้ใช้

  3. ส่งลิงก์การตรวจสอบสิทธิ์ไปยังอีเมลของผู้ใช้ แล้วบันทึกอีเมลของผู้ใช้ในกรณีที่ผู้ใช้ลงชื่อเข้าใช้อีเมลในอุปกรณ์เดียวกันจนเสร็จ

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

ข้อกังวลด้านความปลอดภัย

หากไม่ต้องการให้มีการใช้ลิงก์ลงชื่อเข้าใช้เพื่อลงชื่อเข้าใช้ในฐานะผู้ใช้ที่ไม่ตั้งใจหรือ อุปกรณ์โดยไม่ตั้งใจ Firebase Auth กำหนดให้ที่อยู่อีเมลของผู้ใช้ต้องเป็น ที่ให้ไว้เมื่อทำขั้นตอนการลงชื่อเข้าใช้เสร็จสมบูรณ์ เพื่อให้การลงชื่อเข้าใช้สำเร็จ อีเมลนี้ ต้องตรงกับที่อยู่ที่ส่งลิงก์ลงชื่อเข้าใช้ในตอนแรก

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

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

และโปรดใช้ HTTPS URL ในการใช้งานจริง เพื่อหลีกเลี่ยงการใช้ลิงก์ เซิร์ฟเวอร์ตัวกลางอาจดักจับได้

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

  1. ตั้งค่าแอปให้รับลิงก์แบบไดนามิกใน Flutter ในคำแนะนำ

  2. ในเครื่องจัดการลิงก์ ให้ตรวจสอบว่าลิงก์นั้นมีไว้สำหรับการตรวจสอบสิทธิ์ลิงก์อีเมลหรือไม่ หากใช่ ให้ดำเนินการลงชื่อเข้าใช้ให้เสร็จสิ้น

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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

ความแตกต่างจะอยู่ในครึ่งหลังของการดำเนินการ:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

นอกจากนี้ยังใช้ตรวจสอบสิทธิ์ผู้ใช้ลิงก์อีเมลอีกครั้งก่อนที่จะเรียกใช้ การดำเนินการที่มีความละเอียดอ่อน

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

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

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

แม้ว่าคุณจะสามารถปิดใช้งานการป้องกันการแจกแจงอีเมลสำหรับโปรเจ็กต์ของคุณได้ แต่เรา ไม่แนะนำให้ทำเช่นนั้น

ดูเอกสารเกี่ยวกับการป้องกันการแจกแจงอีเมล เพื่อดูรายละเอียดเพิ่มเติม

ขั้นตอนถัดไป

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

ในแอป คุณสามารถดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จาก ออบเจ็กต์ User รายการ โปรดดูหัวข้อจัดการผู้ใช้

ในฐานข้อมูลเรียลไทม์ของ Firebase และกฎความปลอดภัยของ Cloud Storage คุณจะทำสิ่งต่อไปนี้ได้ รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อ ควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

คุณอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้การตรวจสอบสิทธิ์หลายรายการได้ ผู้ให้บริการโดยลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการการตรวจสอบสิทธิ์) กับ บัญชีผู้ใช้ที่มีอยู่

หากต้องการนำผู้ใช้ออกจากระบบ โปรดโทรหา signOut()

await FirebaseAuth.instance.signOut();