หากอัปเกรดเป็น Firebase Authentication with Identity Platform แล้ว คุณจะเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัยทาง SMS ลงในเว็บแอปได้
การตรวจสอบสิทธิ์แบบหลายปัจจัยช่วยเพิ่มความปลอดภัยให้แอปของคุณ แม้ว่าผู้โจมตีมักเจาะรหัสผ่านและบัญชีโซเชียล แต่การสกัดกั้นข้อความมีความซับซ้อนมากกว่า
ก่อนเริ่มต้น
เปิดใช้ผู้ให้บริการอย่างน้อย 1 รายที่รองรับการตรวจสอบสิทธิ์แบบหลายปัจจัย ผู้ให้บริการทุกรายรองรับ MFA ยกเว้นการตรวจสอบสิทธิ์ทางโทรศัพท์ การตรวจสอบสิทธิ์แบบไม่ระบุชื่อ และ Game Center ของ Apple
เปิดใช้ภูมิภาคที่คุณวางแผนจะใช้การตรวจสอบสิทธิ์ทาง SMS Firebaseใช้นโยบายระดับภูมิภาคที่บล็อก SMS ทั้งหมด ซึ่ง ช่วยสร้างโปรเจ็กต์ในสถานะที่ปลอดภัยยิ่งขึ้นโดยค่าเริ่มต้น
ตรวจสอบว่าแอปของคุณยืนยันอีเมลของผู้ใช้ MFA ต้องมีการยืนยันอีเมล ซึ่งจะช่วยป้องกันไม่ให้ผู้ไม่ประสงค์ดีลงทะเบียนใช้บริการด้วยอีเมลที่ตนเองไม่ได้เป็นเจ้าของ แล้วล็อกเจ้าของตัวจริงไม่ให้เข้าถึงบัญชีโดยการเพิ่มการยืนยันแบบ 2 ขั้นตอน
การใช้กลุ่มผู้ใช้หลายกลุ่ม
หากคุณเปิดใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยเพื่อใช้ในสภาพแวดล้อมแบบหลายผู้เช่า โปรดตรวจสอบ ว่าได้ทำตามขั้นตอนต่อไปนี้ (นอกเหนือจากคำแนะนำอื่นๆ ในเอกสารนี้)
ใน Google Cloud Console ให้เลือกผู้เช่าที่คุณต้องการใช้งาน
ในโค้ด ให้ตั้งค่าฟิลด์
tenantIdในอินสแตนซ์Authเป็นรหัสของ ผู้เช่า เช่นWeb
import { getAuth } from "firebase/auth"; const auth = getAuth(app); auth.tenantId = "myTenantId1";Web
firebase.auth().tenantId = 'myTenantId1';
การเปิดใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย
เปิดหน้าการตรวจสอบสิทธิ์ > วิธีการลงชื่อเข้าใช้ ของคอนโซล Firebase
ในส่วนขั้นสูง ให้เปิดใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยทาง SMS
นอกจากนี้ คุณควรป้อนหมายเลขโทรศัพท์ที่จะใช้ทดสอบแอปด้วย แม้ว่าการลงทะเบียนหมายเลขโทรศัพท์ทดสอบจะไม่บังคับ แต่เราขอแนะนำให้ลงทะเบียนเพื่อ หลีกเลี่ยงการจำกัดอัตราในระหว่างการพัฒนา
หากยังไม่ได้ให้สิทธิ์โดเมนของแอป ให้เพิ่มโดเมนลงในรายการที่อนุญาตในหน้าการตรวจสอบสิทธิ์ > การตั้งค่า ของคอนโซล Firebase
การเลือกรูปแบบการลงทะเบียน
คุณเลือกได้ว่าแอปต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยหรือไม่ รวมถึงวิธี และเวลาในการลงทะเบียนผู้ใช้ รูปแบบที่พบบ่อยมีดังนี้
ลงทะเบียนปัจจัยที่สองของผู้ใช้เป็นส่วนหนึ่งของการลงทะเบียน ใช้วิธีนี้หากแอปกำหนดให้ผู้ใช้ทุกคนต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย
เสนอตัวเลือกที่ข้ามได้เพื่อลงทะเบียนปัจจัยที่ 2 ในระหว่างการลงทะเบียน แอป ที่ต้องการแนะนำให้ใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยแต่ไม่บังคับ อาจเลือกใช้วิธีนี้
ให้ความสามารถในการเพิ่มปัจจัยที่ 2 จากหน้าการจัดการบัญชีหรือโปรไฟล์ของผู้ใช้แทนหน้าจอลงชื่อสมัครใช้ วิธีนี้จะช่วยลดความยุ่งยากในระหว่าง กระบวนการลงทะเบียน ขณะเดียวกันก็ยังคงทำให้การตรวจสอบสิทธิ์แบบหลายปัจจัย พร้อมใช้งานสำหรับผู้ใช้ที่คำนึงถึงความปลอดภัย
กำหนดให้เพิ่มปัจจัยที่ 2 ทีละรายการเมื่อผู้ใช้ต้องการเข้าถึงฟีเจอร์ที่มีข้อกำหนดด้านความปลอดภัยที่เพิ่มขึ้น
การตั้งค่าเครื่องมือยืนยัน reCAPTCHA
คุณต้องกำหนดค่าเครื่องมือยืนยัน reCAPTCHA ก่อนจึงจะส่งรหัส SMS ได้ Firebase ใช้ reCAPTCHA เพื่อป้องกันการละเมิดโดยตรวจสอบว่าคำขอการยืนยันหมายเลขโทรศัพท์มาจากโดเมนที่ได้รับอนุญาตของแอป
คุณไม่จำเป็นต้องตั้งค่าไคลเอ็นต์ reCAPTCHA ด้วยตนเอง เนื่องจากออบเจ็กต์ RecaptchaVerifier ของ SDK ไคลเอ็นต์จะสร้างและเริ่มต้นคีย์และข้อมูลลับของไคลเอ็นต์ที่จำเป็นโดยอัตโนมัติ
การใช้ reCAPTCHA ที่ไม่แสดง
ออบเจ็กต์ RecaptchaVerifier รองรับ reCAPTCHA ที่มองไม่เห็น
ซึ่งมักจะยืนยันผู้ใช้ได้โดยไม่ต้องมีการโต้ตอบใดๆ หากต้องการใช้ reCAPTCHA ที่มองไม่เห็น ให้สร้าง RecaptchaVerifier โดยตั้งค่าพารามิเตอร์ size เป็น invisible แล้วระบุรหัสขององค์ประกอบ UI ที่เริ่มการลงทะเบียนการยืนยันแบบ 2 ขั้นตอน
Web
import { RecaptchaVerifier, getAuth } from "firebase/auth";
const recaptchaVerifier = new RecaptchaVerifier(getAuth(), "sign-in-button", {
"size": "invisible",
"callback": function(response) {
// reCAPTCHA solved, you can proceed with
// phoneAuthProvider.verifyPhoneNumber(...).
onSolvedRecaptcha();
}
});
Web
var recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', {
'size': 'invisible',
'callback': function(response) {
// reCAPTCHA solved, you can proceed with phoneAuthProvider.verifyPhoneNumber(...).
onSolvedRecaptcha();
}
});
การใช้วิดเจ็ต reCAPTCHA
หากต้องการใช้วิดเจ็ต reCAPTCHA ที่มองเห็นได้ ให้สร้างองค์ประกอบ HTML เพื่อบรรจุวิดเจ็ต จากนั้นสร้างออบเจ็กต์ RecaptchaVerifier ที่มีรหัสของคอนเทนเนอร์ UI นอกจากนี้ คุณยังตั้งค่าฟังก์ชันเรียกกลับที่จะเรียกใช้เมื่อ
reCAPTCHA ได้รับการแก้หรือหมดอายุได้ด้วย
Web
import { RecaptchaVerifier, getAuth } from "firebase/auth";
const recaptchaVerifier = new RecaptchaVerifier(
getAuth(),
"recaptcha-container",
// Optional reCAPTCHA parameters.
{
"size": "normal",
"callback": function(response) {
// reCAPTCHA solved, you can proceed with
// phoneAuthProvider.verifyPhoneNumber(...).
onSolvedRecaptcha();
},
"expired-callback": function() {
// Response expired. Ask user to solve reCAPTCHA again.
// ...
}
}
);
Web
var recaptchaVerifier = new firebase.auth.RecaptchaVerifier(
'recaptcha-container',
// Optional reCAPTCHA parameters.
{
'size': 'normal',
'callback': function(response) {
// reCAPTCHA solved, you can proceed with phoneAuthProvider.verifyPhoneNumber(...).
// ...
onSolvedRecaptcha();
},
'expired-callback': function() {
// Response expired. Ask user to solve reCAPTCHA again.
// ...
}
});
การแสดงผล reCAPTCHA ล่วงหน้า
คุณจะแสดงผล reCAPTCHA ล่วงหน้าก่อนเริ่มการลงทะเบียนการยืนยันแบบ 2 ขั้นก็ได้ โดยทำดังนี้
Web
recaptchaVerifier.render()
.then(function (widgetId) {
window.recaptchaWidgetId = widgetId;
});
Web
recaptchaVerifier.render()
.then(function(widgetId) {
window.recaptchaWidgetId = widgetId;
});
หลังจาก render() แก้ไขแล้ว คุณจะได้รับรหัสวิดเจ็ตของ reCAPTCHA ซึ่งคุณสามารถใช้
เพื่อทำการเรียกไปยัง
reCAPTCHA API ได้
var recaptchaResponse = grecaptcha.getResponse(window.recaptchaWidgetId);
RecaptchaVerifier จะแยกตรรกะนี้ออกด้วยเมธอด verify เพื่อให้คุณไม่ต้องจัดการตัวแปร grecaptcha โดยตรง
การลงทะเบียนปัจจัยที่ 2
วิธีลงทะเบียนปัจจัยที่สองใหม่สำหรับผู้ใช้
ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง
ขอให้ผู้ใช้ป้อนหมายเลขโทรศัพท์
เริ่มต้นเครื่องมือยืนยัน reCAPTCHA ตามที่แสดงในส่วนก่อนหน้า ข้ามขั้นตอนนี้หากกำหนดค่าอินสแตนซ์ RecaptchaVerifier ไว้แล้ว
Web
import { RecaptchaVerifier, getAuth } from "firebase/auth"; const recaptchaVerifier = new RecaptchaVerifier( getAuth(),'recaptcha-container-id', undefined);Web
var recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container-id');รับเซสชันแบบหลายปัจจัยสำหรับผู้ใช้
Web
import { multiFactor } from "firebase/auth"; multiFactor(user).getSession().then(function (multiFactorSession) { // ... });Web
user.multiFactor.getSession().then(function(multiFactorSession) { // ... })เริ่มต้นออบเจ็กต์
PhoneInfoOptionsด้วยหมายเลขโทรศัพท์ของผู้ใช้และ เซสชันแบบหลายปัจจัยWeb
// Specify the phone number and pass the MFA session. const phoneInfoOptions = { phoneNumber: phoneNumber, session: multiFactorSession };Web
// Specify the phone number and pass the MFA session. var phoneInfoOptions = { phoneNumber: phoneNumber, session: multiFactorSession };ส่งข้อความยืนยันไปยังโทรศัพท์ของผู้ใช้
Web
import { PhoneAuthProvider } from "firebase/auth"; const phoneAuthProvider = new PhoneAuthProvider(auth); phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier) .then(function (verificationId) { // verificationId will be needed to complete enrollment. });Web
var phoneAuthProvider = new firebase.auth.PhoneAuthProvider(); // Send SMS verification code. return phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier) .then(function(verificationId) { // verificationId will be needed for enrollment completion. })แม้ว่าจะไม่บังคับ แต่แนวทางปฏิบัติแนะนำคือการแจ้งให้ผู้ใช้ทราบล่วงหน้าว่า ผู้ใช้จะได้รับข้อความ SMS และจะมีการคิดอัตราค่าบริการมาตรฐาน
หากคำขอไม่สำเร็จ ให้รีเซ็ต reCAPTCHA แล้วทำขั้นตอนก่อนหน้าซ้ำ เพื่อให้ผู้ใช้ลองอีกครั้งได้ โปรดทราบว่า
verifyPhoneNumber()จะ รีเซ็ต reCAPTCHA โดยอัตโนมัติเมื่อเกิดข้อผิดพลาด เนื่องจาก โทเค็น reCAPTCHA ใช้ได้ครั้งเดียวเท่านั้นWeb
recaptchaVerifier.clear();Web
recaptchaVerifier.clear();เมื่อส่งรหัส SMS แล้ว ให้ขอให้ผู้ใช้ยืนยันรหัสโดยทำดังนี้
Web
// Ask user for the verification code. Then: const cred = PhoneAuthProvider.credential(verificationId, verificationCode);Web
// Ask user for the verification code. Then: var cred = firebase.auth.PhoneAuthProvider.credential(verificationId, verificationCode);เริ่มต้นออบเจ็กต์
MultiFactorAssertionด้วยPhoneAuthCredentialดังนี้Web
import { PhoneMultiFactorGenerator } from "firebase/auth"; const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);Web
var multiFactorAssertion = firebase.auth.PhoneMultiFactorGenerator.assertion(cred);ลงทะเบียนให้เสร็จสมบูรณ์ คุณระบุชื่อที่แสดงสำหรับ ปัจจัยที่ 2 ได้ (ไม่บังคับ) ซึ่งจะเป็นประโยชน์สำหรับผู้ใช้ที่มีปัจจัยที่สองหลายรายการ เนื่องจากระบบจะมาสก์หมายเลขโทรศัพท์ในระหว่างขั้นตอนการตรวจสอบสิทธิ์ (เช่น +1******1234)
Web
// Complete enrollment. This will update the underlying tokens // and trigger ID token change listener. multiFactor(user).enroll(multiFactorAssertion, "My personal phone number");Web
// Complete enrollment. This will update the underlying tokens // and trigger ID token change listener. user.multiFactor.enroll(multiFactorAssertion, 'My personal phone number');
โค้ดด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงทะเบียนใช้การยืนยันแบบ 2 ขั้นตอน
Web
import {
multiFactor, PhoneAuthProvider, PhoneMultiFactorGenerator,
RecaptchaVerifier, getAuth
} from "firebase/auth";
const recaptchaVerifier = new RecaptchaVerifier(getAuth(),
'recaptcha-container-id', undefined);
multiFactor(user).getSession()
.then(function (multiFactorSession) {
// Specify the phone number and pass the MFA session.
const phoneInfoOptions = {
phoneNumber: phoneNumber,
session: multiFactorSession
};
const phoneAuthProvider = new PhoneAuthProvider(auth);
// Send SMS verification code.
return phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier);
}).then(function (verificationId) {
// Ask user for the verification code. Then:
const cred = PhoneAuthProvider.credential(verificationId, verificationCode);
const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);
// Complete enrollment.
return multiFactor(user).enroll(multiFactorAssertion, mfaDisplayName);
});
Web
var recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container-id');
user.multiFactor.getSession().then(function(multiFactorSession) {
// Specify the phone number and pass the MFA session.
var phoneInfoOptions = {
phoneNumber: phoneNumber,
session: multiFactorSession
};
var phoneAuthProvider = new firebase.auth.PhoneAuthProvider();
// Send SMS verification code.
return phoneAuthProvider.verifyPhoneNumber(
phoneInfoOptions, recaptchaVerifier);
})
.then(function(verificationId) {
// Ask user for the verification code.
var cred = firebase.auth.PhoneAuthProvider.credential(verificationId, verificationCode);
var multiFactorAssertion = firebase.auth.PhoneMultiFactorGenerator.assertion(cred);
// Complete enrollment.
return user.multiFactor.enroll(multiFactorAssertion, mfaDisplayName);
});
ยินดีด้วย คุณลงทะเบียนปัจจัยการตรวจสอบสิทธิ์ที่ 2 สำหรับ ผู้ใช้เรียบร้อยแล้ว
การลงชื่อเข้าใช้ของผู้ใช้ด้วยปัจจัยที่สอง
วิธีลงชื่อเข้าใช้ผู้ใช้ด้วยการยืนยันทาง SMS แบบ 2 ปัจจัย
ลงชื่อเข้าใช้ผู้ใช้ด้วยปัจจัยแรก จากนั้นตรวจหาข้อผิดพลาด
auth/multi-factor-auth-requiredข้อผิดพลาดนี้มี ตัวแก้ไข คำแนะนำเกี่ยวกับปัจจัยที่สองที่ลงทะเบียนไว้ และเซสชันพื้นฐาน ที่พิสูจน์ว่าผู้ใช้ตรวจสอบสิทธิ์ด้วยปัจจัยแรกสำเร็จเช่น หากปัจจัยแรกของผู้ใช้คืออีเมลและรหัสผ่าน
Web
import { getAuth, signInWithEmailAndPassword, getMultiFactorResolver} from "firebase/auth"; const auth = getAuth(); signInWithEmailAndPassword(auth, email, password) .then(function (userCredential) { // User successfully signed in and is not enrolled with a second factor. }) .catch(function (error) { if (error.code == 'auth/multi-factor-auth-required') { // The user is a multi-factor user. Second factor challenge is required. resolver = getMultiFactorResolver(auth, error); // ... } else if (error.code == 'auth/wrong-password') { // Handle other errors such as wrong password. } });Web
firebase.auth().signInWithEmailAndPassword(email, password) .then(function(userCredential) { // User successfully signed in and is not enrolled with a second factor. }) .catch(function(error) { if (error.code == 'auth/multi-factor-auth-required') { // The user is a multi-factor user. Second factor challenge is required. resolver = error.resolver; // ... } else if (error.code == 'auth/wrong-password') { // Handle other errors such as wrong password. } ... });หากปัจจัยแรกของผู้ใช้เป็นผู้ให้บริการที่เชื่อมโยง เช่น OAuth, SAML หรือ OIDC ให้ตรวจหาข้อผิดพลาดหลังจากเรียกใช้
signInWithPopup()หรือsignInWithRedirect()หากผู้ใช้ลงทะเบียนปัจจัยที่สองไว้หลายรายการ ให้ถามผู้ใช้ว่าต้องการใช้ปัจจัยใด
Web
// Ask user which second factor to use. // You can get the masked phone number via resolver.hints[selectedIndex].phoneNumber // You can get the display name via resolver.hints[selectedIndex].displayName if (resolver.hints[selectedIndex].factorId === PhoneMultiFactorGenerator.FACTOR_ID) { // User selected a phone second factor. // ... } else if (resolver.hints[selectedIndex].factorId === TotpMultiFactorGenerator.FACTOR_ID) { // User selected a TOTP second factor. // ... } else { // Unsupported second factor. }Web
// Ask user which second factor to use. // You can get the masked phone number via resolver.hints[selectedIndex].phoneNumber // You can get the display name via resolver.hints[selectedIndex].displayName if (resolver.hints[selectedIndex].factorId === firebase.auth.PhoneMultiFactorGenerator.FACTOR_ID) { // User selected a phone second factor. // ... } else if (resolver.hints[selectedIndex].factorId === firebase.auth.TotpMultiFactorGenerator.FACTOR_ID) { // User selected a TOTP second factor. // ... } else { // Unsupported second factor. }เริ่มต้นเครื่องมือยืนยัน reCAPTCHA ตามที่แสดงในส่วนก่อนหน้า ข้ามขั้นตอนนี้หากกำหนดค่าอินสแตนซ์ RecaptchaVerifier ไว้แล้ว
Web
import { RecaptchaVerifier, getAuth } from "firebase/auth"; recaptchaVerifier = new RecaptchaVerifier(getAuth(), 'recaptcha-container-id', undefined);Web
var recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container-id');เริ่มต้นออบเจ็กต์
PhoneInfoOptionsด้วยหมายเลขโทรศัพท์ของผู้ใช้และ เซสชันแบบหลายปัจจัย ค่าเหล่านี้อยู่ในออบเจ็กต์resolverที่ส่งไปยังข้อผิดพลาดauth/multi-factor-auth-requiredWeb
const phoneInfoOptions = { multiFactorHint: resolver.hints[selectedIndex], session: resolver.session };Web
var phoneInfoOptions = { multiFactorHint: resolver.hints[selectedIndex], session: resolver.session };ส่งข้อความยืนยันไปยังโทรศัพท์ของผู้ใช้
Web
// Send SMS verification code. const phoneAuthProvider = new PhoneAuthProvider(auth); phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier) .then(function (verificationId) { // verificationId will be needed for sign-in completion. });Web
var phoneAuthProvider = new firebase.auth.PhoneAuthProvider(); // Send SMS verification code. return phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier) .then(function(verificationId) { // verificationId will be needed for sign-in completion. })หากคำขอไม่สำเร็จ ให้รีเซ็ต reCAPTCHA แล้วทำขั้นตอนก่อนหน้าซ้ำ เพื่อให้ผู้ใช้ลองอีกครั้งได้
Web
recaptchaVerifier.clear();Web
recaptchaVerifier.clear();เมื่อส่งรหัส SMS แล้ว ให้ขอให้ผู้ใช้ยืนยันรหัสโดยทำดังนี้
Web
const cred = PhoneAuthProvider.credential(verificationId, verificationCode);Web
// Ask user for the verification code. Then: var cred = firebase.auth.PhoneAuthProvider.credential(verificationId, verificationCode);เริ่มต้นออบเจ็กต์
MultiFactorAssertionด้วยPhoneAuthCredentialดังนี้Web
const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);Web
var multiFactorAssertion = firebase.auth.PhoneMultiFactorGenerator.assertion(cred);โทรหา
resolver.resolveSignIn()เพื่อทำการตรวจสอบสิทธิ์รองให้เสร็จสมบูรณ์ จากนั้นคุณจะเข้าถึงผลการลงชื่อเข้าใช้เดิมได้ ซึ่งรวมถึง ข้อมูลเฉพาะของผู้ให้บริการมาตรฐานและข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์Web
// Complete sign-in. This will also trigger the Auth state listeners. resolver.resolveSignIn(multiFactorAssertion) .then(function (userCredential) { // userCredential will also contain the user, additionalUserInfo, optional // credential (null for email/password) associated with the first factor sign-in. // For example, if the user signed in with Google as a first factor, // userCredential.additionalUserInfo will contain data related to Google // provider that the user signed in with. // - user.credential contains the Google OAuth credential. // - user.credential.accessToken contains the Google OAuth access token. // - user.credential.idToken contains the Google OAuth ID token. });Web
// Complete sign-in. This will also trigger the Auth state listeners. resolver.resolveSignIn(multiFactorAssertion) .then(function(userCredential) { // userCredential will also contain the user, additionalUserInfo, optional // credential (null for email/password) associated with the first factor sign-in. // For example, if the user signed in with Google as a first factor, // userCredential.additionalUserInfo will contain data related to Google provider that // the user signed in with. // user.credential contains the Google OAuth credential. // user.credential.accessToken contains the Google OAuth access token. // user.credential.idToken contains the Google OAuth ID token. });
โค้ดด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงชื่อเข้าใช้ผู้ใช้ที่ใช้การยืนยันแบบ 2 ขั้นตอน
Web
import {
getAuth,
getMultiFactorResolver,
PhoneAuthProvider,
PhoneMultiFactorGenerator,
RecaptchaVerifier,
signInWithEmailAndPassword
} from "firebase/auth";
const recaptchaVerifier = new RecaptchaVerifier(getAuth(),
'recaptcha-container-id', undefined);
const auth = getAuth();
signInWithEmailAndPassword(auth, email, password)
.then(function (userCredential) {
// User is not enrolled with a second factor and is successfully
// signed in.
// ...
})
.catch(function (error) {
if (error.code == 'auth/multi-factor-auth-required') {
const resolver = getMultiFactorResolver(auth, error);
// Ask user which second factor to use.
if (resolver.hints[selectedIndex].factorId ===
PhoneMultiFactorGenerator.FACTOR_ID) {
const phoneInfoOptions = {
multiFactorHint: resolver.hints[selectedIndex],
session: resolver.session
};
const phoneAuthProvider = new PhoneAuthProvider(auth);
// Send SMS verification code
return phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier)
.then(function (verificationId) {
// Ask user for the SMS verification code. Then:
const cred = PhoneAuthProvider.credential(
verificationId, verificationCode);
const multiFactorAssertion =
PhoneMultiFactorGenerator.assertion(cred);
// Complete sign-in.
return resolver.resolveSignIn(multiFactorAssertion)
})
.then(function (userCredential) {
// User successfully signed in with the second factor phone number.
});
} else if (resolver.hints[selectedIndex].factorId ===
TotpMultiFactorGenerator.FACTOR_ID) {
// Handle TOTP MFA.
// ...
} else {
// Unsupported second factor.
}
} else if (error.code == 'auth/wrong-password') {
// Handle other errors such as wrong password.
}
});
Web
var resolver;
firebase.auth().signInWithEmailAndPassword(email, password)
.then(function(userCredential) {
// User is not enrolled with a second factor and is successfully signed in.
// ...
})
.catch(function(error) {
if (error.code == 'auth/multi-factor-auth-required') {
resolver = error.resolver;
// Ask user which second factor to use.
if (resolver.hints[selectedIndex].factorId ===
firebase.auth.PhoneMultiFactorGenerator.FACTOR_ID) {
var phoneInfoOptions = {
multiFactorHint: resolver.hints[selectedIndex],
session: resolver.session
};
var phoneAuthProvider = new firebase.auth.PhoneAuthProvider();
// Send SMS verification code
return phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, recaptchaVerifier)
.then(function(verificationId) {
// Ask user for the SMS verification code.
var cred = firebase.auth.PhoneAuthProvider.credential(
verificationId, verificationCode);
var multiFactorAssertion =
firebase.auth.PhoneMultiFactorGenerator.assertion(cred);
// Complete sign-in.
return resolver.resolveSignIn(multiFactorAssertion)
})
.then(function(userCredential) {
// User successfully signed in with the second factor phone number.
});
} else if (resolver.hints[selectedIndex].factorId ===
firebase.auth.TotpMultiFactorGenerator.FACTOR_ID) {
// Handle TOTP MFA.
// ...
} else {
// Unsupported second factor.
}
} else if (error.code == 'auth/wrong-password') {
// Handle other errors such as wrong password.
} ...
});
ยินดีด้วย คุณลงชื่อเข้าใช้ผู้ใช้โดยใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย เรียบร้อยแล้ว
ขั้นตอนถัดไป
- จัดการผู้ใช้ที่ใช้การยืนยันแบบ 2 ขั้นตอน แบบเป็นโปรแกรมด้วย Admin SDK