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

หากอัปเกรดเป็นการตรวจสอบสิทธิ์ 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 Apple SDK

    TOTP MFA ได้รับการสนับสนุนเฉพาะใน Apple SDK เวอร์ชัน v10.12.0 ขึ้นไป และเฉพาะใน iOS เท่านั้น

เปิดใช้งาน 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.
    guard let mfaSession = try? await currentUser.multiFactor.session() else { return }
    guard let totpSecret = try? await TOTPMultiFactorGenerator.generateSecret(with: mfaSession) else { return }
    
    // 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:
    let secret = totpSecret.sharedSecretKey()
    

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

    let otpAuthUri = totpSecret.generateQRCodeURL(
        withAccountName: currentUser.email ?? "default account",
        issuer: "Your App Name")
    totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)
    

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

  4. แจ้งให้ผู้ใช้พิมพ์ TOTP ที่แสดงโดยแอป Authenticator และ ใช้เพื่อเสร็จสิ้นการลงทะเบียน MFA

    // Ask the user for a verification code from the authenticator app.
    let verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    let multiFactorAssertion = TOTPMultiFactorGenerator.assertionForEnrollment(
        with: totpSecret,
        oneTimePassword: verificationCode)
    do {
        try await currentUser.multiFactor.enroll(
            with: multiFactorAssertion,
            displayName: "TOTP")
    } catch {
        // Wrong or expired OTP. Re-prompt the user.
    }
    

ให้ผู้ใช้ลงชื่อเข้าใช้ด้วยปัจจัยที่ 2

หากต้องการลงชื่อเข้าใช้ให้ผู้ใช้ด้วย TOTP MFA ให้ใช้รหัสต่อไปนี้

  1. เรียกใช้หนึ่งในวิธี signIn(with...:)- ตามที่คุณต้องการหากคุณไม่ใช้ โดยใช้ MFA (เช่น signIn(withEmail:password:)) ถ้าเมธอดส่ง ข้อผิดพลาดที่มีรหัส secondFactorRequired ให้เริ่มขั้นตอน MFA ของแอป

    do {
        let authResult = try await Auth.auth().signIn(withEmail: email, password: password)
    
        // 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.)
    
        // ...
    } catch let error as AuthErrorCode where error.code == .secondFactorRequired {
        // Initiate your second factor sign-in flow. (See next step.)
        // ...
    } catch {
        // Other auth error.
        throw error
    }
    
  2. ขั้นตอน MFA ของแอปควรแจ้งให้ผู้ใช้เลือกปัจจัยที่ 2 ก่อน ที่พวกเขาต้องการใช้ คุณสามารถดูรายการปัจจัยที่สองที่สนับสนุนได้โดย ตรวจสอบพร็อพเพอร์ตี้ hints ของอินสแตนซ์ MultiFactorResolver

    let mfaKey = AuthErrorUserInfoMultiFactorResolverKey
    guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return }
    let enrolledFactors = resolver.hints.map(\.displayName)
    
  3. หากผู้ใช้เลือกใช้ TOTP ให้พิมพ์ TOTP ที่แสดงอยู่ แอป Authenticator ของตนและใช้เพื่อลงชื่อเข้าใช้

    let multiFactorInfo = resolver.hints[selectedIndex]
    switch multiFactorInfo.factorID {
    case TOTPMultiFactorID:
        let otpFromAuthenticator = // OTP typed by the user.
        let assertion = TOTPMultiFactorGenerator.assertionForSignIn(
            withEnrollmentID: multiFactorInfo.uid,
            oneTimePassword: otpFromAuthenticator)
        do {
            let authResult = try await resolver.resolveSignIn(with: assertion)
        } catch {
            // Wrong or expired OTP. Re-prompt the user.
        }
    default:
        return
    }
    

ยกเลิกการลงทะเบียนจาก TOTP MFA

หัวข้อนี้จะอธิบายวิธีการจัดการผู้ใช้ที่ยกเลิกการลงทะเบียนจาก TOTP MFA

หากผู้ใช้ได้ลงชื่อสมัครใช้ตัวเลือก MFA หลายรายการ และหากผู้ใช้ยกเลิกการลงทะเบียน จากตัวเลือกที่เปิดใช้ล่าสุด ผู้ใช้จะได้รับ auth/user-token-expired และออกจากระบบแล้ว ผู้ใช้ต้องลงชื่อเข้าใช้อีกครั้งและยืนยัน ข้อมูลเข้าสู่ระบบที่มีอยู่ เช่น อีเมลแล���รหัสผ่าน

หากต้องการยกเลิกการลงทะเบียนผู้ใช้ จัดการข้อผิดพลาด และเรียกใช้การตรวจสอบสิทธิ์ซ้ำ ให้ใช้ รหัสต่อไปนี้:

guard let currentUser = Auth.auth().currentUser else { return }

// Prompt the user to select a factor to unenroll, from this array:
currentUser.multiFactor.enrolledFactors

// ...

// Unenroll the second factor.
let multiFactorInfo = currentUser.multiFactor.enrolledFactors[selectedIndex]
do {
    try await currentUser.multiFactor.unenroll(with: multiFactorInfo)
} catch let error as AuthErrorCode where error.code == .invalidUserToken {
    // Second factor unenrolled, but the user was signed out. Re-authenticate
    // them.
}

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