หากอัปเกรดเป็น Firebase Authentication with Identity Platform คุณจะเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัย (MFA) โดยใช้รหัสผ่านที่สามารถใช้งานได้เพียงครั้งเดียวตามเวลา (TOTP) ลงในแอปได้
Firebase Authentication with Identity Platform ช่วยให้คุณใช้ TOTP เป็นปัจจัยเพิ่มเติมสำหรับ MFA ได้ เมื่อคุณเปิดใช้ฟีเจอร์นี้ ผู้ใช้ที่พยายามลงชื่อเข้าใช้แอปจะเห็นคำขอ TOTP หากต้องการสร้างรหัส ผู้ใช้ต้องใช้แอปตรวจสอบสิทธิ์ที่สามารถสร้างรหัส TOTP ที่ถูกต้อง เช่น Google Authenticator
ก่อนเริ่มต้น
เปิดใช้ผู้ให้บริการที่รองรับ MFA อย่างน้อย 1 ราย โปรดทราบว่าผู้ให้บริการทุกรายยกเว้นผู้ให้บริการต่อไปนี้รองรับ MFA
- การตรวจสอบสิทธิ์ทางโทรศัพท์
- การตรวจสอบสิทธิ์แบบไม่ระบุชื่อ
- โทเค็นการตรวจสอบสิทธิ์ที่กำหนดเอง
- Apple Game Center
ตรวจสอบว่าแอปยืนยันอีเมลของผู้ใช้ การตรวจสอบสิทธิ์แบบหลายปัจจัยกำหนดให้ต้องมีการยืนยันอีเมล วิธีนี้จะช่วยป้องกันผู้ไม่ประสงค์ดีไม่ให้ลงทะเบียนใช้บริการด้วยอีเมลที่ไม่ได้เป็นเจ้าของ แล้วล็อกเจ้าของอีเมลตัวจริงออกด้วยการเพิ่มปัจจัยที่ 2
ติดตั้ง Firebase Android SDK หากยังไม่ได้ดำเนินการ
ฟีเจอร์นี้ใช้ได้กับ Android SDK เวอร์ชัน v22.1.0 ขึ้นไปเท่านั้น
เปิดใช้ MFA ของ TOTP
หากต้องการเปิดใช้ 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 ค่าเริ่มต้นคือ 5TOTP ทำงานโดยตรวจสอบว่าเมื่อบุคคล 2 ราย (ผู้พิสูจน์และผู้ตรวจสอบ) สร้าง OTP ภายในกรอบเวลาเดียวกัน (โดยปกติคือ 30 วินาที) บุคคลเหล่านั้นจะสร้างรหัสผ่านเดียวกัน อย่างไรก็ตาม คุณสามารถกําหนดค่าบริการ 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 ค่าเริ่มต้นคือ 5TOTP ทำงานโดยการตรวจสอบว่าเมื่อบุคคล 2 ฝ่าย (ผู้พิสูจน์และผู้ตรวจสอบ) สร้าง OTP ภายในกรอบเวลาเดียวกัน (โดยปกติคือ 30 วินาที) จะต้องสร้างรหัสผ่านเดียวกัน อย่างไรก็ตาม เพื่อรองรับสัญญาณของนาฬิการะหว่างฝ่ายต่างๆ และเวลาตอบสนองของมนุษย์ คุณสามารถกำหนดค่าบริการ TOTP ให้ยอมรับ TOTP จากหน้าต่างที่อยู่ติดกัน
เลือกรูปแบบการลงทะเบียน
คุณเลือกได้ว่าจะให้แอปใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยหรือไม่ รวมถึงวิธีและเวลาในการลงทะเบียนผู้ใช้ รูปแบบที่พบบ่อยบางส่วนมีดังนี้
ลงทะเบียนปัจจัยที่ 2 ของผู้ใช้เป็นส่วนหนึ่งของการลงทะเบียน ใช้วิธีนี้หากแอปกำหนดให้ผู้ใช้ทุกคนต้องการตรวจสอบสิทธิ์แบบหลายปัจจัย
เสนอตัวเลือกที่ข้ามได้เพื่อลงทะเบียนปัจจัยที่ 2 ในระหว่างการลงทะเบียน คุณอาจใช้แนวทางนี้หากต้องการส่งเสริมแต่ไม่บังคับให้ใช้การตรวจสอบสิทธิ์แบบหลายปัจจัยในแอป
เพิ่มตัวเลือกให้เพิ่มปัจจัยที่ 2 จากหน้าการจัดการบัญชีหรือโปรไฟล์ของผู้ใช้แทนหน้าจอลงชื่อสมัครใช้ วิธีนี้ช่วยลดความยุ่งยากในกระบวนการลงทะเบียน ในขณะเดียวกันก็ยังคงให้บริการการตรวจสอบสิทธิ์แบบหลายปัจจัยแก่ผู้ใช้ที่ให้ความสำคัญกับความปลอดภัย
กำหนดให้เพิ่มปัจจัยที่ 2 เมื่อผู้ใช้ต้องการเข้าถึงฟีเจอร์ที่มีข้อกำหนดด้านความปลอดภัยที่เพิ่มขึ้น
ลงทะเบียนผู้ใช้ใน MFA ของ TOTP
หลังจากเปิดใช้ MFA ของ TOTP เป็นปัจจัยที่ 2 สําหรับแอปแล้ว ให้ใช้ตรรกะฝั่งไคลเอ็นต์เพื่อลงทะเบียนผู้ใช้ใน MFA ของ TOTP โดยทําดังนี้
ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง
สร้างข้อมูลลับ 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.) } }
แสดงรหัสลับให้ผู้ใช้เห็นและแจ้งให้ผู้ใช้ป้อนรหัสลับลงในแอปตรวจสอบสิทธิ์
// 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 และใช้ TOTP ดังกล่าวเพื่อลงชื่อเข้าใช้
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. } }
ยกเลิกการลงทะเบียน MFA โดยใช้ TOTP
ส่วนนี้จะอธิบายวิธีจัดการเมื่อผู้ใช้ยกเลิกการลงทะเบียนจาก MFA ของ TOTP
หากผู้ใช้ลงชื่อสมัครใช้ตัวเลือก 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