หากอัปเกรดเป็น Firebase Authentication with Identity Platform แล้ว คุณสามารถเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัย (MFA) โดยใช้รหัสผ่านแบบใช้ครั้งเดียวตามเวลา (TOTP) ลงในแอปได้
Firebase Authentication with Identity Platform ช่วยให้คุณใช้ TOTP เป็นปัจจัยเพิ่มเติมสำหรับ MFA ได้ เมื่อเปิดใช้ฟีเจอร์นี้ ผู้ใช้ที่พยายามลงชื่อเข้าใช้แอปจะเห็นคำขอ TOTP หากต้องการสร้างรหัส ผู้ใช้ต้องใช้แอป Authenticator ที่สามารถสร้างรหัส TOTP ที่ถูกต้องได้ เช่น Google Authenticator
ก่อนเริ่มต้น
เปิดใช้ผู้ให้บริการอย่างน้อย 1 รายที่รองรับ MFA โปรดทราบว่าผู้ให้บริการทั้งหมดยกเว้นผู้ให้บริการต่อไปนี้รองรับ MFA
- การตรวจสอบสิทธิ์ทางโทรศัพท์
- การตรวจสอบสิทธิ์แบบไม่ระบุชื่อ
- โทเค็นการตรวจสอบสิทธิ์ที่กำหนดเอง
- Apple Game Center
ตรวจสอบว่าแอปยืนยันอีเมลของผู้ใช้ MFA ต้องมีการยืนยันอีเมล ซึ่งจะป้องกันไม่ให้ผู้ไม่ประสงค์ดีลงทะเบียนใช้บริการด้วยอีเมลที่ตนไม่ได้เป็นเจ้าของ แล้วล็อกไม่ให้เจ้าของอีเมลที่แท้จริงเข้าถึงได้โดยการเพิ่มปัจจัยที่ 2
หากยังไม่ได้ติดตั้ง ให้ติดตั้ง Firebase Android SDK
MFA แบบ TOTP ใช้ได้ใน Android SDK เวอร์ชัน v22.1.0 ขึ้นไปเท่านั้น
เปิดใช้ TOTP MFA
หากต้องการเปิดใช้ TOTP เป็นปัจจัยที่ 2 ให้ใช้ Admin SDK หรือเรียกใช้ปลายทาง REST ของการกำหนดค่าโปรเจ็กต์
หากต้องการใช้ Admin SDK ให้ทำดังนี้
หากยังไม่ได้ติดตั้ง ให้ติดตั้ง Firebase Admin Node.js SDK
TOTP MFA รองรับเฉพาะใน Firebase Admin Node.js SDK เวอร์ชัน 11.6.0 ขึ้นไปเท่านั้น
เรียกใช้คำสั่งต่อไปนี้
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })แทนที่ค่าต่อไปนี้
NUM_ADJ_INTERVALS: จำนวนช่วงเวลาที่อยู่ติดกันซึ่งจะยอมรับ TOTP ตั้งแต่ 0 ถึง 10 ค่าเริ่มต้นคือ 5 รายการTOTP ทำงานโดยตรวจสอบว่าเมื่อทั้ง 2 ฝ่าย (ผู้พิสูจน์และผู้ตรวจสอบ) สร้าง OTP ภายในกรอบเวลาเดียวกัน (โดยปกติจะใช้เวลา 30 วินาที) ทั้ง 2 ฝ่ายจะสร้างรหัสผ่านเดียวกัน อย่างไรก็ตาม เพื่อรองรับความคลาดเคลื่อนของนาฬิการะหว่างฝ่ายต่างๆ และเวลาตอบสนองของมนุษย์ คุณสามารถกำหนดค่าบริการ TOTP ให้ยอมรับ TOTP จากหน้าต่างที่อยู่ติดกันได้ด้วย
หากต้องการเปิดใช้ TOTP MFA โดยใช้ REST API ให้เรียกใช้คำสั่งต่อไปนี้
curl -X PATCH "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=mfa" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: PROJECT_ID" \
-d \
'{
"mfa": {
"providerConfigs": [{
"state": "ENABLED",
"totpProviderConfig": {
"adjacentIntervals": NUM_ADJ_INTERVALS
}
}]
}
}'
แทนที่ค่าต่อไปนี้
PROJECT_ID: รหัสโปรเจ็กต์NUM_ADJ_INTERVALS: จำนวนช่วงกรอบเวลา ตั้งแต่ 0 ถึง 10 โดยค่าเริ่มต้นคือ 5 รายการTOTP ทำงานโดยตรวจสอบว่าเมื่อทั้ง 2 ฝ่าย (ผู้พิสูจน์และผู้ตรวจสอบ) สร้าง OTP ภายในกรอบเวลาเดียวกัน (โดยปกติจะใช้เวลา 30 วินาที) ทั้ง 2 ฝ่ายจะสร้างรหัสผ่านเดียวกัน อย่างไรก็ตาม เพื่อรองรับความคลาดเคลื่อนของนาฬิการะหว่างฝ่ายต่างๆ และเวลาตอบสนองของมนุษย์ คุณสามารถกำหนดค่าบริการ TOTP ให้ยอมรับ TOTP จากหน้าต่างที่อยู่ติดกันได้ด้วย
เลือกรูปแบบการลงทะเบียน
คุณเลือกได้ว่าแอปของคุณต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยหรือไม่ รวมถึงวิธีและเวลาในการลงทะเบียนผู้ใช้ รูปแบบที่พบบ่อยมีดังนี้
ลงทะเบียนปัจจัยที่ 2 ของผู้ใช้เป็นส่วนหนึ่งของการลงทะเบียน ใช้วิธีนี้หากแอปของคุณกำหนดให้ผู้ใช้ทุกคนต้องใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย
เสนอตัวเลือกที่ข้ามได้เพื่อลงทะเบียนปัจจัยที่ 2 ในระหว่างการลงทะเบียน หากต้องการส่งเสริมแต่ไม่บังคับให้ใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยในแอป คุณอาจใช้วิธีนี้
ให้ความสามารถในการเพิ่มปัจจัยที่ 2 จากหน้าการจัดการบัญชีหรือโปรไฟล์ของผู้ใช้ แทนที่จะเป็นหน้าจอลงชื่อสมัครใช้ วิธีนี้จะช่วยลดความยุ่งยากในระหว่างกระบวนการลงทะเบียน ขณะเดียวกันก็ยังคงให้ผู้ใช้ที่ให้ความสำคัญกับความปลอดภัยสามารถใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยได้
กำหนดให้เพิ่มปัจจัยที่ 2 ทีละขั้นเมื่อผู้ใช้ต้องการเข้าถึงฟีเจอร์ที่มีข้อกำหนดด้านความปลอดภัยที่เข้มงวดขึ้น
ลงทะเบียนผู้ใช้ใน TOTP MFA
หลังจากเปิดใช้ TOTP MFA เป็นปัจจัยที่ 2 สำหรับแอปแล้ว ให้ใช้ตรรกะฝั่งไคลเอ็นต์เพื่อลงทะเบียนผู้ใช้ใน TOTP MFA โดยทำดังนี้
ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง
สร้างข้อมูลลับ TOTP สำหรับผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว โดยทำดังนี้
// Generate a TOTP secret. Firebase.auth.currentUser.multiFactor.session .addOnSuccessListener { multiFactorSession -> TotpMultiFactorGenerator.generateSecret(multiFactorSession) .addOnSuccessListener { totpSecret -> // Display the secret to the user and prompt them to // enter it into their authenticator app. (See the next // step.) } }แสดงข้อมูลลับให้ผู้ใช้เห็นและแจ้งให้ผู้ใช้ป้อนข้อมูลลับนั้นในแอป Authenticator
// Display this key: val secret = totpSecret.sharedSecretKeyนอกจากการแสดงคีย์ลับแล้ว คุณยังพยายามเพิ่มคีย์ลับลงในแอป Authenticator เริ่มต้นของอุปกรณ์โดยอัตโนมัติได้ด้วย โดยสร้าง URI คีย์ที่เข้ากันได้กับ Google Authenticator แล้วส่งไปยัง
openInOtpApp()ดังนี้val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)หลังจากผู้ใช้เพิ่มข้อมูลลับลงในแอป Authenticator แล้ว แอปจะเริ่มสร้าง TOTP
แจ้งให้ผู้ใช้พิมพ์ TOTP ที่แสดงโดยแอป Authenticator และใช้ TOTP เพื่อลงทะเบียน MFA ให้เสร็จสมบูรณ์ โดยทำดังนี้
// Ask the user for a verification code from the authenticator app. val verificationCode = // Code from user input. // Finalize the enrollment. val multiFactorAssertion = TotpMultiFactorGenerator .getAssertionForEnrollment(totpSecret, verificationCode) Firebase.auth.currentUser.multiFactor.enroll(multiFactorAssertion, "TOTP") .addOnSuccessListener { // Enrollment complete. }
ลงชื่อเข้าใช้ผู้ใช้ด้วยปัจจัยที่ 2
หากต้องการลงชื่อเข้าใช้ผู้ใช้ด้วย TOTP MFA ให้ใช้โค้ดต่อไปนี้
เรียกใช้เมธอด
signInWith- เมธอดใดเมธอดหนึ่งเหมือนกับที่คุณทำหากไม่ได้ใช้ MFA (เช่นsignInWithEmailAndPassword()) หากเมธอดแสดงFirebaseAuthMultiFactorExceptionให้เริ่มขั้นตอน MFA ของแอปFirebase.auth.signInWithEmailAndPassword(email, password) .addOnSuccessListener { result -> // If the user is not enrolled with a second factor and provided valid // credentials, sign-in succeeds. // (If your app requires MFA, this could be considered an error // condition, which you would resolve by forcing the user to enroll a // second factor.) // ... } .addOnFailureListener { exception -> when (exception) { is FirebaseAuthMultiFactorException -> { // Initiate your second factor sign-in flow. (See next step.) // ... } } }ขั้นตอน MFA ของแอปควรแจ้งให้ผู้ใช้เลือกปัจจัยที่ 2 ที่ต้องการใช้ก่อน คุณดูรายการปัจจัยที่ 2 ที่รองรับได้โดยตรวจสอบพร็อพเพอร์ตี้
hintsของอินสแตนซ์MultiFactorResolverดังนี้val enrolledFactors = exception.resolver.hints.map { it.displayName }หากผู้ใช้เลือกใช้ TOTP ให้แจ้งให้ผู้ใช้พิมพ์ TOTP ที่แสดงในแอป Authenticator และใช้เพื่อลงชื่อเข้าใช้ โดยทำดังนี้
when (exception.resolver.hints[selectedIndex].factorId) { TotpMultiFactorGenerator.FACTOR_ID -> { val otpFromAuthenticator = // OTP typed by the user. val assertion = TotpMultiFactorGenerator.getAssertionForSignIn( exception.resolver.hints[selectedIndex].uid, otpFromAuthenticator ) exception.resolver.resolveSignIn(assertion) .addOnSuccessListener { result -> // Successfully signed in! } .addOnFailureListener { resolveError -> // Invalid or expired OTP. } } PhoneMultiFactorGenerator.FACTOR_ID -> { // Handle SMS second factor. } }
ยกเลิกการลงทะเบียน TOTP MFA
ส่วนนี้จะอธิบายวิธีจัดการผู้ใช้ที่ยกเลิกการลงทะเบียนจาก TOTP MFA
หากผู้ใช้ลงชื่อสมัครใช้ตัวเลือก MFA หลายรายการ และหากยกเลิกการลงทะเบียนจากตัวเลือกที่เปิดใช้ล่าสุด ผู้ใช้จะได้รับ auth/user-token-expired และออกจากระบบ ผู้ใช้ต้องลงชื่อเข้าใช้อีกครั้งและยืนยันข้อมูลเข้าสู่ระบบที่มีอยู่ เช่น อีเมลและรหัสผ่าน
หากต้องการยกเลิกการลงทะเบียนผู้ใช้ จัดการข้อผิดพลาด และทริกเกอร์การตรวจสอบสิทธิ์อีกครั้ง ให้ใช้โค้ดต่อไปนี้
Firebase.auth.currentUser.multiFactor.unenroll(mfaEnrollmentId)
.addOnSuccessListener {
// Second factor unenrolled.
}
.addOnFailureListener { exception ->
when (exception) {
is FirebaseAuthInvalidUserException -> {
// Second factor unenrolled. If the user was signed out, re-authenticate
// them.
// For example, if they signed in with a password, prompt them to
// provide it again, then call `reauthenticateWithCredential()` as shown
// below.
val credential = EmailAuthProvider.getCredential(email, password)
currentUser.reauthenticate(credential)
.addOnSuccessListener {
// Success!
}
.addOnFailureListener {
// Bad email address and password combination.
}
}
}
}
ขั้นตอนถัดไป
- จัดการผู้ใช้ที่ใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยแบบเป็นโปรแกรมด้วย Admin SDK