คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อลงชื่อเข้าใช้ผู้ใช้ได้โดยส่งอีเมลที่มีลิงก์ให้ผู้ใช้คลิกเพื่อลงชื่อเข้าใช้ ในกระบวนการนี้ ระบบจะยืนยันอีเมลของผู้ใช้ด้วย
การลงชื่อเข้าใช้ด้วยอีเมลมีประโยชน์มากมาย ดังนี้
- การลงชื่อสมัครใช้และการลงชื่อเข้าใช้ที่สะดวก
- ลดความเสี่ยงในการใช้รหัสผ่านซ้ำในแอปพลิเคชันต่างๆ ซึ่งอาจทำให้ความปลอดภัยของรหัสผ่านที่เลือกมาอย่างดีลดลง
- ความสามารถในการตรวจสอบสิทธิ์ผู้ใช้ไปพร้อมกับยืนยันว่าผู้ใช้เป็นเจ้าของอีเมลอย่างถูกต้อง
- ผู้ใช้เพียงต้องมีบัญชีอีเมลที่เข้าถึงได้เพื่อลงชื่อเข้าใช้ คุณไม่จำเป็นต้องเป็นเจ้าของหมายเลขโทรศัพท์หรือบัญชีโซเชียลมีเดีย
- ผู้ใช้สามารถลงชื่อเข้าใช้ได้อย่างปลอดภัยโดยไม่ต้องระบุ (หรือจำ) รหัสผ่าน ซึ่งอาจยุ่งยากในอุปกรณ์เคลื่อนที่
- ผู้ใช้เดิมที่ลงชื่อเข้าใช้ด้วยตัวระบุอีเมล (รหัสผ่านหรือแบบรวมศูนย์) ก่อนหน้านี้จะอัปเกรดให้ลงชื่อเข้าใช้ด้วยอีเมลเพียงอย่างเดียวได้ ตัวอย่างเช่น ผู้ใช้ที่ลืมรหัสผ่านจะยังคงลงชื่อเข้าใช้ได้โดยไม่ต้องรีเซ็ตรหัสผ่าน
ก่อนเริ่มต้น
หากยังไม่ได้ดำเนินการ ให้ทำตามขั้นตอนในคู่มือเริ่มต้นใช้งาน
เปิดใช้การลงชื่อเข้าใช้ด้วยลิงก์อีเมลสําหรับโปรเจ็กต์ Firebase
หากต้องการลงชื่อเข้าใช้ผู้ใช้ด้วยลิงก์อีเมล คุณต้องเปิดใช้ผู้ให้บริการอีเมลและวิธีลงชื่อเข้าใช้ด้วยลิงก์อีเมลสําหรับโปรเจ็กต์ Firebase ก่อน โดยทำดังนี้
- เปิดส่วน Auth ในคอนโซล Firebase
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการอีเมล/รหัสผ่าน โปรดทราบว่าต้องเปิดใช้การลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่านจึงจะใช้การลงชื่อเข้าใช้ด้วยลิงก์อีเมลได้
- ในส่วนเดียวกัน ให้เปิดใช้วิธีการลงชื่อเข้าใช้ลิงก์อีเมล (ลงชื่อเข้าใช้แบบไม่ต้องใช้รหัสผ่าน)
- คลิกบันทึก
ส่งลิงก์การตรวจสอบสิทธิ์ไปยังอีเมลของผู้ใช้
หากต้องการเริ่มขั้นตอนการตรวจสอบสิทธิ์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้ระบุอีเมล จากนั้นเรียกใช้ sendSignInLinkToEmail()
เพื่อขอให้ Firebase ส่งลิงก์การตรวจสอบสิทธิ์ไปยังอีเมลของผู้ใช้
สร้างออบเจ็กต์ ActionCodeSettings ซึ่งจะให้วิธีการสร้างลิงก์อีเมลแก่ Firebase ตั้งค่าฟิลด์ต่อไปนี้
url
: Deep Link ที่จะฝังและสถานะเพิ่มเติมที่จะส่งต่อ โดเมนของลิงก์ต้องอยู่ในรายการโดเมนที่ได้รับอนุญาตของคอนโซล Firebase ซึ่งดูได้โดยไปที่แท็บการตั้งค่า (การตรวจสอบสิทธิ์ -> การตั้งค่า -> โดเมนที่ได้รับอนุญาต) ลิงก์จะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL นี้หากไม่ได้ติดตั้งแอปในอุปกรณ์และติดตั้งแอปไม่ได้androidPackageName
และIOSBundleId
: แอปที่จะใช้เมื่อเปิดลิงก์ลงชื่อเข้าใช้ในอุปกรณ์ Android หรือ iOS ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่า Firebase Dynamic Links ให้เปิดลิงก์การดําเนินการทางอีเมลผ่านแอปบนอุปกรณ์เคลื่อนที่handleCodeInApp
: ตั้งค่าเป็นtrue
การดำเนินการลงชื่อเข้าใช้ต้องดำเนินการให้เสร็จสมบูรณ์ในแอปเสมอ ต่างจากการดำเนินการอื่นๆ ทางอีเมลนอกช่องทาง (การรีเซ็ตรหัสผ่านและการยืนยันอีเมล) เนื่องจากเมื่อสิ้นสุดขั้นตอน ผู้ใช้จะลงชื่อเข้าใช้และสถานะการตรวจสอบสิทธิ์จะยังคงอยู่ในแอปdynamicLinkDomain
: (เลิกใช้งานแล้ว ให้ใช้linkDomain
) เมื่อมีการกําหนดโดเมนลิงก์แบบไดนามิกที่กําหนดเองหลายรายการสําหรับโปรเจ็กต์ ให้ระบุโดเมนที่จะใช้เมื่อเปิดลิงก์โดยใช้แอปบนอุปกรณ์เคลื่อนที่ที่ระบุ (เช่นexample.page.link
) มิเช่นนั้นระบบจะเลือกโดเมนแรกโดยอัตโนมัติlinkDomain
: โดเมนโฮสติ้งของ Firebase ที่กําหนดเองซึ่งไม่บังคับที่จะใช้เมื่อเปิดลิงก์โดยใช้แอปบนอุปกรณ์เคลื่อนที่ที่ระบุ โดเมนต้องได้รับการกําหนดค่าในโฮสติ้งของ Firebase และโปรเจ็กต์ต้องเป็นเจ้าของ โดเมนนี้ต้องไม่ใช่โดเมนโฮสติ้งเริ่มต้น (web.app
หรือfirebaseapp.com
) การตั้งค่านี้จะแทนที่การตั้งค่าdynamicLinkDomain
ที่เลิกใช้งานแล้ว
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 การเปลี่ยนเส้นทางและนำกลับมาใช้ใหม่ เนื่องจากอาจเปิดใช้การแทรกเซสชัน
หลังจากลงชื่อเข้าใช้เสร็จแล้ว ระบบจะนำกลไกการลงชื่อเข้าใช้ก่อนหน้านี้ที่ยังไม่ได้ยืนยันออกจากผู้ใช้ และเซสชันที่มีอยู่จะใช้งานไม่ได้ ตัวอย่างเช่น หากก่อนหน้านี้มีคนสร้างบัญชีที่ยังไม่ยืนยันโดยใช้อีเมลและรหัสผ่านเดียวกัน ระบบจะนำรหัสผ่านของผู้ใช้ออกเพื่อป้องกันไม่ให้ผู้แอบอ้างเป็นบุคคลอื่นที่อ้างสิทธิ์ความเป็นเจ้าของและสร้างบัญชีที่ยังไม่ยืนยันดังกล่าวลงชื่อเข้าใช้อีกครั้งด้วยอีเมลและรหัสผ่านที่ยังไม่ยืนยัน
นอกจากนี้ โปรดตรวจสอบว่าคุณใช้ URL ของ HTTPS ในเวอร์ชันที่ใช้งานจริงเพื่อหลีกเลี่ยงไม่ให้เซิร์ฟเวอร์สื่อกลางอาจขัดขวางลิงก์ของคุณ
ลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
เราได้เลิกใช้งานลิงก์แบบไดนามิกของ Firebase แล้ว ตอนนี้ระบบจะใช้โฮสติ้งของ Firebase เพื่อส่งลิงก์ลงชื่อเข้าใช้ ทำตามคำแนะนำในการกำหนดค่าสำหรับแพลตฟอร์มที่เฉพาะเจาะจง
ยืนยันลิงก์อีเมลและลงชื่อเข้าใช้
หากต้องการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์ผ่านแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ คุณต้องกำหนดค่าแอปพลิเคชันให้ตรวจหาลิงก์แอปพลิเคชันขาเข้า แยกวิเคราะห์ Deep Link ที่เกี่ยวข้อง แล้วลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
ในตัวแฮนเดิลลิงก์ ให้ตรวจสอบว่าลิงก์มีไว้สำหรับการตรวจสอบสิทธิ์ลิงก์อีเมลหรือไม่ และหากใช่ ให้ดำเนินการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
// 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 และกฎการรักษาความปลอดภัยของพื้นที่เก็บข้อมูลระบบคลาวด์ คุณสามารถรับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth
และใช้เพื่อควบคุมข้อมูลต่างๆ ที่ผู้ใช้เข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายได้โดยการลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการออกจากระบบของผู้ใช้ ให้เรียกใช้ signOut()
ดังนี้
await FirebaseAuth.instance.signOut();