เพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัยของ TOTP ลงในแอป Android

หากอัปเกรดเป็นการตรวจสอบสิทธิ์ Firebase ด้วย Identity Platform แล้ว คุณจะเพิ่มรหัสผ่านที่สามารถใ��้����������้�������ย��ครั้งเดียวตามเวลาได้ (TOTP) การตรวจสอบสิทธิ์แบบหลายปัจจัย (MFA) ไปยังแอปของคุณ

การตรวจสอบสิทธิ์ Firebase ด้วย Identity Platform ช่วยให้คุณใช้ TOTP เป็นปัจจัยเพิ่มเติมสำหรับ MFA ได้ เมื่อคุณ เปิดใช้ฟีเจอร์นี้ ผู้ใช้ที่พยายามลงชื่อเข้าใช้แอปจะเห็นคำขอ TOTP ในการสร้างแอป บุคคลนั้นต้องใช้แอป Authenticator ที่สร้างได้ รหัส TOTP ที่ถูกต้อง เช่น Google Authenticator

ก่อนเริ่มต้น

  1. เปิดใช้ผู้ให้บริการอย่างน้อย 1 รายที่รองรับ MFA โปรดทราบว่าผู้ให้บริการทั้งหมด ยกเว้น MFA การสนับสนุนต่อไปนี้

    • การตรวจสอบสิทธิ์ทางโทรศัพท์
    • การตรวจสอบสิทธิ์แบบไม่ระบุชื่อ
    • โทเค็นกา���ตรวจสอบสิทธิ์ที่กำหนดเอง
    • เกมเซ็นเตอร์ของ Apple
  2. ตรวจสอบว่าแอปยืนยันอีเมลของผู้ใช้ MFA ต้องใช้อีเมล การยืนยันของคุณ วิธีนี้จะป้องกันไม่ให้ผู้ไม่ประสงค์ดีลงทะเบียนใช้บริการ ด้วยที่อยู่อีเมลที่พวกเขาไม่ได้เป็นเจ้าของ แล้วล็อก เจ้าของอีเมลโดยเพิ่มปัจจัยที่ 2

  3. ติดตั้ง Firebase Android SDK

    TOTP MFA ได้รับการสนับสนุนเฉพาะใน Android SDK เวอร์ชัน v22.1.0 และสูงกว่า

เปิดใช้งาน TOTP MFA

หากต้องการเปิดใช้ TOTP เป็นปัจจัยที่ 2 ให้ใช้ Admin SDK หรือเรียกใช้โปรเจ็กต์ การกำหนดค่าปลายทาง REST

หากต้องการใช้ Admin SDK ให้ทำดังนี้

  1. ติดตั้ง SDK Node.js ของผู้ดูแลระบบ Firebase

    TOTP MFA ได้รับการสนับสนุนเฉพาะใน Firebase Admin Node.js SDK เวอร์ชัน 11.6.0 และ ที่ด้านบน

  2. เรียกใช้โค้ดต่อไปนี้

    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 วินาที) ยาว) พวกเขาสร้างรหัสผ่านเดียวกัน แต่เพื่อให้สะดวกต่อนาฬิกา คลาดเคลื่อนระหว่างฝ่ายต่างๆ และเวลาตอบสนองของมนุษย์ คุณสามารถกำหนดค่า 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 วินาที) ยาว) พวกเขาสร้างรหัสผ่านเดียวกัน แต่เพื่อให้สะดวกต่อนาฬิกา คลาดเคลื่อนระหว่างฝ่ายต่างๆ และเวลาตอบสนองของมนุษย์ คุณสามารถกำหนดค่า TOTP เพื่อรับ TOTP จากหน้าต่างที่อยู่ติดกัน

เลือกรูปแบบการลงทะเบียน

คุณเลือกได้ว่าจะให้แอปต้องใช้การตรวจสอบสิทธิ์แบบหลายปั��จัยหรือไม่ รวมถึงวิธี และกรณีที่ควรลงทะเบียนผู้ใช้ รูปแบบที่พบบ่อยบางส่วนมีดังนี้

  • ลงทะเบียนปัจจัยที่ 2 ของผู้ใช้ซึ่งเป็นส่วนหนึ่งของการลงทะเบียน ใช้ร่างคำตอบนี้ หากแอปของคุณต้องตรวจสอบสิทธิ์แบบหลายปัจจัยสำหรับผู้ใช้ทั้งหมด

  • เสนอตัวเลือกที่ข้ามได้เพื่อลงทะเบียนปัจจัยที่ 2 ระหว่างการลงทะเบียน หากคุณ ที่ต้องการกระตุ้น แต่ไม่ต้องการการตรวจสอบสิทธิ์แบบหลายปัจจัยในแอป อาจใช้วิธีนี้

  • มอบความสามารถในการเพิ่มปัจจัยที่ 2 จากบัญชีหรือโปรไฟล์ของผู้ใช้ หน้าการจัดการ แทนที่จะเป็นหน้าจอลงชื่อสมัครใช้ ซึ่งจะช่วยลดการติดขัดในระหว่าง กระบวนการลงทะเบียน ขณะที่ยังทำการตรวจสอบสิทธิ์แบบหลายปัจจัย พร้อมใช้งานสำหรับผู้ใช้ที่มีความละเอียดอ่อนด้านความปลอดภัย

  • ต้องเพิ่มปัจจัยที่ 2 เพิ่มเมื่อผู้ใช้ต้องการเข้าถึง ที่มีข้อกำหนดด้านความปลอดภัยที่เพิ่มขึ้น

ลงทะเบียนผู้ใช้ใน TOTP MFA

หลังจากที่คุณเปิดใช้ TOTP MFA เป็นปัจจัยที่ 2 สำหรับแอปของคุณ ให้ใช้ฝั่งไคลเอ็นต์ ตรรกะในการลงทะเบียนผู้ใช้ใน TOTP MFA:

  1. ตรวจสอบสิทธิ์ผู้ใช้อีกครั้ง

  2. สร้างข้อมูลลับ 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.)
                }
        }
    
  3. แสดงข้อมูลลับให้ผู้ใช้ป้อนและแจ้งให้ป้อน แอป Authenticator:

    // Display this key:
    val secret = totpSecret.sharedSecretKey
    

    นอกจากการแสดงคีย์ลับแล้ว คุณยังสามารถพยายาม ให้เพิ่มลงในแอป Authenticator เริ่มต้นของอุปกรณ์ โดยสร้างมิติข้อมูล URL คีย์ที่เข้ากันได้กับ Google Authenticator และส่งไปยัง openInOtpApp():

    val qrCodeUri = totpSecret.generateQrCodeUrl(
        currentUser.email ?: "default account",
        "Your App Name")
    totpSecret.openInOtpApp(qrCodeUri)
    

    หลังจากผู้ใช้เพิ่มข้อมูลลับในแอป Authenticator แล้ว แอปจะเริ่มต้น ในการสร้าง TOTP

  4. แจ้งให้ผู้ใช้พิมพ์ TOTP ที่แสดงโดยแอป Authenticator และ ใช้เพื่อเสร็จสิ้นการลงทะเบียน 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 ให้ใช้รหัสต่อไปนี้

  1. เรียกใช้เมธอด 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.)
                    // ...
                }
            }
        }
    
  2. ขั้นตอน MFA ของแอปควรแจ้งให้ผู้ใช้เลือกปัจจัยที่ 2 ก่อน ที่พวกเขาต้องการใช้ คุณสามารถดูรายการปัจจัยที่สองที่สนับสนุนได้โดย ตรวจสอบพร็อพเพอร์ตี้ hints ของอินสแตนซ์ MultiFactorResolver

    val enrolledFactors = exception.resolver.hints.map { it.displayName }
    
  3. หากผู้ใช้เลือกใช้ 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.
                    }
            }
        }
    }

ขั้นตอนถัดไป