หากอัปเกรดเป็นการตรวจสอบสิทธิ์ Firebase ด้วย Identity Platform แล้ว คุณจะเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัยทาง SMS ลงในแอป Flutter ได้
การตรวจสอบสิทธิ์แบบหลายปัจจัย (MFA) ช่วยเพิ่มความปลอดภัยให้แอปของคุณ แม้ว่าผู้โจมตีมักจะเจาะรหัสผ่านและบัญชีโซเชียล แต่การสกัดกั้นข้อความทำได้ยากกว่า
ก่อนเริ่มต้น
เปิดใช้ผู้ให้บริการอย่างน้อย 1 รายที่รองรับการตรวจสอบสิทธิ์แบบหลายปัจจัย ผู้ให้บริการทุกรายรองรับ MFA ยกเว้นการตรวจสอบสิทธิ์ทางโทรศัพท์ การตรวจสอบสิทธิ์แบบไม่ระบุชื่อ และ Game Center ของ Apple
ตรวจสอบว่าแอปของคุณยืนยันอีเมลของผู้ใช้ MFA ต้องมีการยืนยันอีเมล ซึ่งจะป้องกันไม่ให้ผู้ไม่ประสงค์ดีลงทะเบียนใช้บริการด้วยอีเมลที่ตนเองไม่ได้เป็นเจ้าของ แล้วล็อกเจ้าของตัวจริงไม่ให้เข้าถึงบัญชีโดยการเพิ่มการยืนยันแบบ 2 ขั้นตอน
Android: หากยังไม่ได้ตั้งค่าแฮช SHA-256 ของแอปใน Firebase Console ให้ตั้งค่า ดูข้อมูลเกี่ยวกับการค้นหาแฮช SHA-256 ของแอปได้ที่การตรวจสอบสิทธิ์ไคลเอ็นต์
iOS: ใน Xcode ให้เปิดใช้ข้อความ Push สำหรับโปรเจ็กต์และตรวจสอบว่าได้กำหนดค่าคีย์การตรวจสอบสิทธิ์ APNs ด้วย Firebase Cloud Messaging (FCM) แล้ว นอกจากนี้ คุณต้องเปิดใช้โหมดเบื้องหลังสำหรับการแจ้งเตือนจากระยะไกลด้วย หากต้องการดูคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนนี้ โปรดดูเอกสารประกอบ Firebase iOS Phone Auth
เว็บ: ตรวจสอบว่าคุณได้เพิ่มโดเมนแอปพลิเคชันในคอนโซล Firebase แล้ว ในส่วน โดเมนเปลี่ยนเส้นทาง OAuth
การเปิดใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย
เปิดหน้าการตรวจสอบสิทธิ์ > วิธีลงชื่อเข้าใช้ ของคอนโซล Firebase
ในส่วนขั้นสูง ให้เปิดใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยทาง SMS
นอกจากนี้ คุณควรป้อนหมายเลขโทรศัพท์ที่จะใช้ทดสอบแอปด้วย แม้ว่าการลงทะเบียนหมายเลขโทรศัพท์ทดสอบจะไม่บังคับ แต่เราขอแนะนำให้ลงทะเบียนเพื่อ หลีกเลี่ยงการจำกัดอัตราในระหว่างการพัฒนา
หากยังไม่ได้ให้สิทธิ์โดเมนของแอป ให้เพิ่มโดเมนลงในรายการที่อนุญาตในหน้าการตรวจสอบสิทธิ์ > การตั้งค่า ของคอนโซล Firebase
การเลือกรูปแบบการลงทะเบียน
คุณเลือกได้ว่าแอปต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยหรือไม่ รวมถึงวิธี และเวลาในการลงทะเบียนผู้ใช้ รูปแบบที่พบบ่อยมีดังนี้
ลงทะเบียนปัจจัยที่สองของผู้ใช้เป็นส่วนหนึ่งของการลงทะเบียน ใช้วิธีนี้หากแอปกำหนดให้ผู้ใช้ทุกคนต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย
เสนอตัวเลือกที่ข้ามได้เพื่อลงทะเบียนปัจจัยที่ 2 ในระหว่างการลงทะเบียน แอป ที่ต้องการแนะนำให้ใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยแต่ไม่บังคับ อาจชอบแนวทางนี้
ให้ความสามารถในการเพิ่มปัจจัยที่ 2 จากหน้าการจัดการบัญชีหรือโปรไฟล์ของผู้ใช้แทนหน้าจอลงชื่อสมัครใช้ วิธีนี้จะช่วยลดความยุ่งยากในระหว่าง กระบวนการลงทะเบียน ขณะเดียวกันก็ยังคงทำให้การตรวจสอบสิทธิ์แบบหลายปัจจัย พร้อมใช้งานสำหรับผู้ใช้ที่คำนึงถึงความปลอดภัย
กำหนดให้เพิ่มปัจจัยที่ 2 ทีละรายการเมื่อผู้ใช้ต้องการเข้าถึงฟีเจอร์ที่มีข้อกำหนดด้านความปลอดภัยที่เพิ่มขึ้น
การลงทะเบียนปัจจัยที่ 2
วิธีลงทะเบียนปัจจัยที่สองใหม่สำหรับผู้ใช้
ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง
ขอให้ผู้ใช้ป้อนหมายเลขโทรศัพท์
รับเซสชันแบบหลายปัจจัยสำหรับผู้ใช้
final multiFactorSession = await user.multiFactor.getSession();ยืนยันหมายเลขโทรศัพท์ด้วยเซสชันแบบหลายปัจจัยและการเรียกกลับ
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: multiFactorSession, phoneNumber: phoneNumber, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // The SMS verification code has been sent to the provided phone number. // ... }, codeAutoRetrievalTimeout: (_) {}, );เมื่อส่งรหัส SMS แล้ว ให้ขอให้ผู้ใช้ยืนยันรหัสโดยทำดังนี้
final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, );ทำตามขั้นตอนการลงทะเบียนให้เสร็จสมบูรณ์
await user.multiFactor.enroll( PhoneMultiFactorGenerator.getAssertion( credential, ), );
โค้ดด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงทะเบียนใช้การยืนยันแบบ 2 ขั้นตอน
final session = await user.multiFactor.getSession();
final auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
multiFactorSession: session,
phoneNumber: phoneController.text,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await user.multiFactor.enroll(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
ยินดีด้วย คุณลงทะเบียนปัจจัยการตรวจสอบสิทธิ์ที่ 2 สำหรับ ผู้ใช้เรียบร้อยแล้ว
การลงชื่อเข้าใช้ของผู้ใช้ด้วยปัจจัยที่สอง
วิธีลงชื่อเข้าใช้ผู้ใช้ด้วยการยืนยันทาง SMS แบบ 2 ปัจจัย
ลงชื่อเข้าใช้ผู้ใช้ด้วยปัจจัยแรก จากนั้นดักจับข้อยกเว้น
FirebaseAuthMultiFactorExceptionข้อผิดพลาดนี้มีตัวแก้ไข ซึ่งคุณใช้เพื่อรับปัจจัยที่ 2 ที่ผู้ใช้ลงทะเบียนไว้ได้ นอกจากนี้ ยังมีเซสชันพื้นฐานที่พิสูจน์ว่าผู้ใช้ได้ตรวจสอบสิทธิ์ด้วยปัจจัยแรกเรียบร้อยแล้วเช่น หากปัจจัยแรกของผู้ใช้คืออีเมลและรหัสผ่าน
try { await _auth.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text, ); // User is not enrolled with a second factor and is successfully // signed in. // ... } on FirebaseAuthMultiFactorException catch (e) { // The user is a multi-factor user. Second factor challenge is required final resolver = e.resolver // ... }หากผู้ใช้ลงทะเบียนปัจจัยที่สองไว้หลายรายการ ให้ถามผู้ใช้ว่าต้องการใช้ปัจจัยใด
final session = e.resolver.session; final hint = e.resolver.hints[selectedHint];ส่งข้อความยืนยันไปยังโทรศัพท์ของผู้ใช้พร้อมคำแนะนำและเซสชันแบบหลายปัจจัย
await FirebaseAuth.instance.verifyPhoneNumber( multiFactorSession: session, multiFactorInfo: hint, verificationCompleted: (_) {}, verificationFailed: (_) {}, codeSent: (String verificationId, int? resendToken) async { // ... }, codeAutoRetrievalTimeout: (_) {}, );โทรหา
resolver.resolveSignIn()เพื่อทำการตรวจสอบสิทธิ์รองให้เสร็จสมบูรณ์final smsCode = await getSmsCodeFromUser(context); if (smsCode != null) { // Create a PhoneAuthCredential with the code final credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode, ); try { await e.resolver.resolveSignIn( PhoneMultiFactorGenerator.getAssertion(credential) ); } on FirebaseAuthException catch (e) { print(e.message); } }
โค้ดด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงชื่อเข้าใช้ผู้ใช้ที่ใช้การยืนยันแบบ 2 ขั้นตอน
try {
await _auth.signInWithEmailAndPassword(
email: emailController.text,
password: passwordController.text,
);
} on FirebaseAuthMultiFactorException catch (e) {
setState(() {
error = '${e.message}';
});
final firstHint = e.resolver.hints.first;
if (firstHint is! PhoneMultiFactorInfo) {
return;
}
await FirebaseAuth.instance.verifyPhoneNumber(
multiFactorSession: e.resolver.session,
multiFactorInfo: firstHint,
verificationCompleted: (_) {},
verificationFailed: (_) {},
codeSent: (String verificationId, int? resendToken) async {
// See `firebase_auth` example app for a method of retrieving user's sms code:
// https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
final smsCode = await getSmsCodeFromUser(context);
if (smsCode != null) {
// Create a PhoneAuthCredential with the code
final credential = PhoneAuthProvider.credential(
verificationId: verificationId,
smsCode: smsCode,
);
try {
await e.resolver.resolveSignIn(
PhoneMultiFactorGenerator.getAssertion(
credential,
),
);
} on FirebaseAuthException catch (e) {
print(e.message);
}
}
},
codeAutoRetrievalTimeout: (_) {},
);
} catch (e) {
...
}
ยินดีด้วย คุณลงชื่อเข้าใช้ผู้ใช้โดยใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย เรียบร้อยแล้ว
ขั้นตอนถัดไป
- จัดการผู้ใช้ที่ใช้การยืนยันแบบ 2 ขั้นตอน โดยอัตโนมัติด้วย Admin SDK