คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งอีเมลที่มีลิงก์ซึ่งผู้ใช้สามารถคลิกเพื่อลงชื่อเข้าใช้ได้ ในกระบวนการนี้ ที่อยู่อีเมลของผู้ใช้จะได้รับการยืนยันด้วย
การลงชื่อเข้าใช้ทางอีเมลมีประโยชน์มากมาย:
- การลงทะเบียนและการลงชื่อเข้าใช้ที่มีแรงเสียดทานต่ำ
- ลดความเสี่ยงของการใช้รหัสผ่านซ้ำในแอปพลิเคชัน ซึ่งอาจบ่อนทำลายความปลอดภัยของรหัสผ่านที่เลือกมาอย่างดี
- ความสามารถในการตรวจสอบสิทธิ์ผู้ใช้ในขณะเดียวกันก็ยืนยันว่าผู้ใช้เป็นเจ้าของที่อยู่อีเมลที่ถูกต้องตามกฎหมาย
- ผู้ใช้ต้องการเพียงบัญชีอีเมลที่สามารถเข้าถึงได้เพื่อลงชื่อเข้าใช้ ไม่จำเป็นต้องเป็นเจ้าของหมายเลขโทรศัพท์หรือบัญชีโซเชียลมีเดีย
- ผู้ใช้สามารถลงชื่อเข้าใช้ได้อย่างปลอดภัยโดยไม่จำเป็นต้องระบุ (หรือจำ) รหัสผ่าน ซึ่งอาจยุ่งยากบนอุปกรณ์เคลื่อนที่
- ผู้ใช้ปัจจุบันที่ลงชื่อเข้าใช้ด้วยตัวระบุอีเมลก่อนหน้านี้ (รหัสผ่านหรือแบบรวมศูนย์) สามารถอัปเกรดให้ลงชื่อเข้าใช้ด้วยอีเมลเพียงอย่างเดียวได้ ตัวอย่างเช่น ผู้ใช้ที่ลืมรหัสผ่านยังสามารถลงชื่อเข้าใช้ได้โดยไม่จำเป็นต้องรีเซ็ตรหัสผ่าน
ก่อนที่คุณจะเริ่ม
หากคุณยังไม่ได้ดำเนินการ ให้ทำตามขั้นตอนในคู่มือ เริ่มต้นใช้ งาน
เปิดใช้งานการลงชื่อเข้าใช้ลิงก์อีเมลสำหรับโปรเจ็กต์ Firebase ของคุณ
หากต้องการลงชื่อเข้าใช้ผู้ใช้ด้วยลิงก์อีเมล คุณต้องเปิดใช้งานผู้ให้บริการอีเมลและวิธีการลงชื่อเข้าใช้ลิงก์อีเมลสำหรับโปรเจ็กต์ Firebase ของคุณก่อน:
- ใน คอนโซล Firebase ให้เปิดส่วน การตรวจสอบสิทธิ์
- บนแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการ อีเมล/รหัสผ่าน โปรดทราบว่าต้องเปิดใช้งานการลงชื่อเข้าใช้อีเมล/รหัสผ่านเพื่อใช้การลงชื่อเข้าใช้ลิงก์อีเมล
- ในส่วนเดียวกัน ให้เปิดใช้งานวิธีลงชื่อ เข้าใช้ลิงก์อีเมล (ลงชื่อเข้าใช้โดยไม่ใช้รหัสผ่าน)
- คลิก บันทึก
ส่งลิงก์การรับรองความถูกต้องไปยังที่อยู่อีเมลของผู้ใช้
ในการเริ่มต้นขั้นตอนการตรวจสอบสิทธิ์ ให้นำเสนออินเทอร์เฟซที่แจ้งให้ผู้ใช้ระบุที่อยู่อีเมลของตน จากนั้นโทร sendSignInLinkToEmail()
เพื่อขอให้ Firebase ส่งลิงก์การตรวจสอบสิทธิ์ไปยังอีเมลของผู้ใช้
สร้างออบเจ็กต์ ActionCodeSettings ซึ่งให้คำแนะนำเกี่ยวกับวิธีสร้างลิงก์อีเมลแก่ Firebase ตั้งค่าฟิลด์ต่อไปนี้:
url
: ลิงก์ในรายละเอียดที่จะฝังและสถานะเพิ่มเติมใดๆ ที่จะส่งต่อ โดเมนของลิงก์จะต้องอยู่ในรายการที่อนุญาตพิเศษในรายการคอนโซล Firebase ของโดเมนที่ได้รับอนุญาต ซึ่งสามารถพบได้โดยไปที่แท็บวิธีการลงชื่อเข้าใช้ (การรับรองความถูกต้อง -> วิธีการลงชื่อเข้าใช้) ลิงก์จะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL นี้ หากไม่ได้ติดตั้งแอปบนอุปกรณ์ของตนและไม่สามารถติดตั้งแอปได้androidPackageName
และIOSBundleId
: แอปที่จะใช้เมื่อเปิดลิงก์ลงชื่อเข้าใช้บนอุปกรณ์ Android หรือ iOS เรียนรู้เพิ่มเติมเกี่ยวกับวิธีกำหนดค่า Firebase Dynamic Links เพื่อเปิดลิงก์การดำเนินการอีเมลผ่านแอปมือถือ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');
ขออีเมลจากผู้ใช้
ส่งลิงก์การตรวจสอบสิทธิ์ไปยังอีเมลของผู้ใช้ และบันทึกอีเมลของผู้ใช้ในกรณีที่ผู้ใช้ลงชื่อเข้าใช้อีเมลบนอุปกรณ์เครื่องเดียวกัน
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 Dynamic Links เพื่อส่งลิงก์อีเมลไปยังอุปกรณ์เคลื่อนที่ เพื่อให้การลงชื่อเข้าใช้เสร็จสมบูรณ์ผ่านแอปพลิเคชันมือถือ จะต้องกำหนดค่าแอปพลิเคชันให้ตรวจจับลิงก์แอปพลิเคชันขาเข้า แยกวิเคราะห์ลิงก์ในรายละเอียด จากนั้นจึงลงชื่อเข้าใช้ให้เสร็จสิ้น
ตั้งค่าแอปของคุณเพื่อรับลิงก์แบบไดนามิกบน Flutter ใน คำแนะนำ
ในตัวจัดการลิงก์ของคุณ ให้ตรวจสอบว่าลิงก์นั้นมีไว้สำหรับการตรวจสอบสิทธิ์ลิงก์อีเมลหรือไม่ และหากเป็นเช่นนั้น ให้ทำตามขั้นตอนการลงชื่อเข้าใช้ให้เสร็จสิ้น
// 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 Realtime และกฎความปลอดภัยของ Cloud Storage คุณสามารถรับรหัสผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้ได้จากตัวแปร auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้จะเข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย การเชื่อมโยงข้อมูลประจำตัวของผู้ให้บริการตรวจสอบสิทธิ์ ) กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการออกจากระบบผู้ใช้ ให้โทร signOut()
:
await FirebaseAuth.instance.signOut();