获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

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

หากคุณได้อัปเกรดเป็นการตรวจสอบสิทธิ์ Firebase ด้วย Identity Platform คุณสามารถเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัยทาง SMS ลงในแอป iOS ของคุณได้

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

ก่อนจะเริ่ม

  1. เปิดใช้งานผู้ให้บริการอย่างน้อยหนึ่งรายที่รองรับการตรวจสอบสิทธิ์แบบหลายปัจจัย ผู้ให้บริการทุกรายรองรับ MFA ยกเว้น การตรวจสอบสิทธิ์ทางโทรศัพท์ การตรวจสอบสิทธิ์แบบไม่ระบุตัวตน และ Apple Game Center

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

การเปิดใช้งานการพิสูจน์ตัวตนแบบหลายปัจจัย

  1. เปิดหน้า การ ตรวจสอบสิทธิ์ > วิธีการลงชื่อเข้าใช้ ของคอนโซล Firebase

  2. ในส่วน ขั้นสูง ให้เปิดใช้ งาน SMS Multi-factor Authentication

    คุณควรป้อนหมายเลขโทรศัพท์ที่คุณจะใช้ทดสอบแอปด้วย แม้ว่าจะเป็นทางเลือก แต่ขอแนะนำให้ลงทะเบียนหมายเลขโทรศัพท์ทดสอบเพื่อหลีกเลี่ยงการควบคุมปริมาณระหว่างการพัฒนา

  3. หากคุณยังไม่ได้อนุญาตโดเมนของแอป ให้เพิ่มลงในรายการอนุญาตในหน้าการ ตรวจสอบสิทธิ์ > การตั้งค่า ของคอนโซล Firebase

กำลังตรวจสอบแอปของคุณ

Firebase ต้องยืนยันว่าคำขอ SMS มาจากแอปของคุณ คุณสามารถทำได้สองวิธี:

  • การ แจ้งเตือน APN แบบไม่มีเสียง : เมื่อคุณลงชื่อเข้าใช้ผู้ใช้เป็นครั้งแรก Firebase สามารถส่งการแจ้งเตือนแบบเงียบไปยังอุปกรณ์ของผู้ใช้ได้ การตรวจสอบสิทธิ์สามารถดำเนินการต่อได้หากแอปได้รับการแจ้งเตือน โปรดทราบว่าตั้งแต่ iOS 8.0 เป็นต้นไป คุณไม่จำเป็นต้องขอให้ผู้ใช้อนุญาตการแจ้งเตือนแบบพุชให้ใช้วิธีนี้

  • การ ยืนยัน reCAPTCHA : หากคุณไม่สามารถส่งการแจ้งเตือนแบบไม่มีเสียง (เช่น เนื่องจากผู้ใช้ปิดใช้งานการรีเฟรชพื้นหลัง หรือคุณกำลังทดสอบแอปของคุณในโปรแกรมจำลอง iOS) คุณสามารถใช้ reCAPTCHA ได้ ในหลายกรณี reCAPTCHA จะแก้ไขตัวเองโดยอัตโนมัติโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ

ใช้การแจ้งเตือนแบบไม่มีเสียง

วิธีเปิดใช้งานการแจ้งเตือน APN สำหรับใช้กับ Firebase:

  1. ใน Xcode เปิดใช้งานการแจ้งเตือนแบบพุช สำหรับโครงการของคุณ

  2. อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ของคุณโดยใช้คอนโซล Firebase (การเปลี่ยนแปลงของคุณจะส่งต่อไปยัง Google Cloud Firebase โดยอัตโนมัติ) หากคุณยังไม่มีคีย์การตรวจสอบสิทธิ์ APN โปรดดูที่การ กำหนดค่า APN ด้วย FCM เพื่อเรียนรู้วิธีรับ

    1. เปิด คอนโซล Firebase

    2. ไปที่ การตั้งค่าโปรเจ็ กต์

    3. เลือกแท็บ Cloud Messaging

    4. ใต้ คีย์การตรวจสอบสิทธิ์ APN ในส่วน การกำหนดค่าแอป iOS ให้คลิก อัปโหลด

    5. เลือกคีย์ของคุณ

    6. เพิ่มรหัสคีย์สำหรับคีย์ คุณสามารถค้นหารหัสคีย์ได้ภายใต้ ใบรับรอง ตัวระบุ และโปรไฟล์ ใน Apple Developer Member Center

    7. คลิก อัปโหลด

หากคุณมีใบรับรอง APN อยู่แล้ว คุณสามารถอัปโหลดใบรับรองแทนได้

การใช้การยืนยัน reCAPTCHA

วิธีเปิดใช้งานไคลเอ็นต์ SDK เพื่อใช้ reCAPTCHA:

  1. เปิดการกำหนดค่าโครงการของคุณใน Xcode

  2. คลิกสองครั้งที่ชื่อโครงการในมุมมองแบบต้นไม้ด้านซ้าย

  3. เลือกแอปของคุณจากส่วน เป้าหมาย

  4. เลือกแท็บ ข้อมูล

  5. ขยายส่วน ประเภท URL

  6. คลิกปุ่ม +

  7. ป้อนรหัสไคลเอ็นต์ที่กลับรายการของคุณในฟิลด์ URL Schemes คุณสามารถค้นหาค่านี้ได้ในไฟล์การกำหนดค่า GoogleService-Info.plist เป็น REVERSED_CLIENT_ID

เมื่อเสร็จแล้ว การกำหนดค่าของคุณควรมีลักษณะดังนี้:

รูปแบบที่กำหนดเอง

คุณสามารถเลือกปรับแต่งวิธีที่แอปของคุณนำเสนอ SFSafariViewController หรือ UIWebView เมื่อแสดง reCAPTCHA ในการดำเนินการนี้ ให้สร้างคลาสแบบกำหนดเองที่สอดคล้องกับโปรโตคอล FIRAuthUIDelegate และส่งผ่านไปยัง verifyPhoneNumber:UIDelegate:completion:

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

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

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

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

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

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

การลงทะเบียนปัจจัยที่สอง

ในการลงทะเบียนปัจจัยรองใหม่สำหรับผู้ใช้:

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

  2. ขอให้ผู้ใช้ป้อนหมายเลขโทรศัพท์

  3. รับเซสชันหลายปัจจัยสำหรับผู้ใช้:

    Swift

    authResult.user.multiFactor.getSessionWithCompletion() { (session, error) in
      // ...
    }
    

    วัตถุประสงค์-C

    [authResult.user.multiFactor
      getSessionWithCompletion:^(FIRMultiFactorSession * _Nullable session,
                                NSError * _Nullable error) {
        // ...
    }];
    
  4. ส่งข้อความยืนยันไปยังโทรศัพท์ของผู้ใช้ ตรวจสอบให้แน่ใจว่าหมายเลขโทรศัพท์อยู่ในรูปแบบที่มี + นำหน้า และไม่มีเครื่องหมายวรรคตอนหรือช่องว่างอื่น (เช่น: +15105551234 )

    Swift

    // Send SMS verification code.
    PhoneAuthProvider.provider().verifyPhoneNumber(
      phoneNumber,
      uiDelegate: nil,
      multiFactorSession: session) { (verificationId, error) in
        // verificationId will be needed for enrollment completion.
    }
    

    วัตถุประสงค์-C

    // Send SMS verification code.
    [FIRPhoneAuthProvider.provider verifyPhoneNumber:phoneNumber
                                          UIDelegate:nil
                                  multiFactorSession:session
                                          completion:^(NSString * _Nullable verificationID,
                                                        NSError * _Nullable error) {
        // verificationId will be needed for enrollment completion.
    }];
    

    แม้ว่าจะไม่จำเป็น แต่ควรแจ้งให้ผู้ใช้ทราบล่วงหน้าว่าพวกเขาจะได้รับข้อความ SMS และใช้อัตรามาตรฐานดังกล่าว

    วิธี verifyPhoneNumber() เริ่มกระบวนการตรวจสอบแอปในพื้นหลังโดยใช้การแจ้งเตือนแบบไม่มีเสียง หากไม่มีการแจ้งเตือนแบบเงียบ ระบบจะออกคำท้า reCAPTCHA แทน

  5. เมื่อส่งรหัส SMS แล้ว ให้ขอให้ผู้ใช้ตรวจสอบรหัส จากนั้น ใช้การตอบสนองเพื่อสร้าง PhoneAuthCredential :

    Swift

    // Ask user for the verification code. Then:
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId,
      verificationCode: verificationCode)
    

    วัตถุประสงค์-C

    // Ask user for the SMS verification code. Then:
    FIRPhoneAuthCredential *credential = [FIRPhoneAuthProvider.provider
                                           credentialWithVerificationID:verificationID
                                           verificationCode:kPhoneSecondFactorVerificationCode];
    
  6. เริ่มต้นวัตถุยืนยัน:

    Swift

    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    

    วัตถุประสงค์-C

    FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
    
  7. เสร็จสิ้นการลงทะเบียน คุณสามารถเลือกระบุชื่อที่แสดงสำหรับปัจจัยที่สองได้ สิ่งนี้มีประโยชน์สำหรับผู้ใช้ที่มีปัจจัยหลายวินาที เนื่องจากหมายเลขโทรศัพท์ถูกปิดบังระหว่างขั้นตอนการตรวจสอบสิทธิ์ (เช่น +1******1234)

    Swift

    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    user.multiFactor.enroll(with: assertion, displayName: displayName) { (error) in
      // ...
    }
    

    วัตถุประสงค์-C

    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    [authResult.user.multiFactor enrollWithAssertion:assertion
                                         displayName:nil
                                          completion:^(NSError * _Nullable error) {
        // ...
    }];
    

รหัสด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงทะเบียนปัจจัยที่สอง:

Swift

let user = Auth.auth().currentUser
user?.multiFactor.getSessionWithCompletion({ (session, error) in
  // Send SMS verification code.
  PhoneAuthProvider.provider().verifyPhoneNumber(
    phoneNumber,
    uiDelegate: nil,
    multiFactorSession: session
  ) { (verificationId, error) in
    // verificationId will be needed for enrollment completion.
    // Ask user for the verification code.
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId!,
      verificationCode: phoneSecondFactorVerificationCode)
    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    user?.multiFactor.enroll(with: assertion, displayName: displayName) { (error) in
      // ...
    }
  }
})

วัตถุประสงค์-C

FIRUser *user = FIRAuth.auth.currentUser;
[user.multiFactor getSessionWithCompletion:^(FIRMultiFactorSession * _Nullable session,
                                              NSError * _Nullable error) {
    // Send SMS verification code.
    [FIRPhoneAuthProvider.provider
      verifyPhoneNumber:phoneNumber
      UIDelegate:nil
      multiFactorSession:session
      completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
        // verificationId will be needed for enrollment completion.

        // Ask user for the verification code.
        // ...

        // Then:
        FIRPhoneAuthCredential *credential =
            [FIRPhoneAuthProvider.provider credentialWithVerificationID:verificationID
                                                        verificationCode:kPhoneSecondFactorVerificationCode];
        FIRMultiFactorAssertion *assertion =
            [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];

        // Complete enrollment. This will update the underlying tokens
        // and trigger ID token change listener.
        [user.multiFactor enrollWithAssertion:assertion
                                  displayName:displayName
                                    completion:^(NSError * _Nullable error) {
            // ...
        }];
    }];
}];

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

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

ในการลงชื่อเข้าใช้ผู้ใช้ด้วยการยืนยันทาง SMS แบบสองปัจจัย:

  1. ลงชื่อเข้าใช้ให้ผู้ใช้ด้วยปัจจัยแรก จากนั้นตรวจพบข้อผิดพลาดที่ระบุว่าจำเป็นต้องมีการตรวจสอบสิทธิ์แบบหลายปัจจัย ข้อผิดพลาดนี้มีตัวแก้ไข คำแนะนำเกี่ยวกับปัจจัยที่สองที่ลงทะเบียน และเซสชันพื้นฐานที่พิสูจน์ว่าผู้ใช้รับรองความถูกต้องด้วยปัจจัยแรกได้สำเร็จ

    ตัวอย่างเช่น หากปัจจัยแรกของผู้ใช้คืออีเมลและรหัสผ่าน:

    Swift

    Auth.auth().signIn(
      withEmail: email,
      password: password
    ) { (result, error) in
      let authError = error as NSError
      if authError?.code == AuthErrorCode.secondFactorRequired.rawValue {
        // The user is a multi-factor user. Second factor challenge is required.
        let resolver =
          authError!.userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
        // ...
      } else {
        // Handle other errors such as wrong password.
      }
    }
    

    วัตถุประสงค์-C

    [FIRAuth.auth signInWithEmail:email
                         password:password
                       completion:^(FIRAuthDataResult * _Nullable authResult,
                                    NSError * _Nullable error) {
        if (error == nil || error.code != FIRAuthErrorCodeSecondFactorRequired) {
            // User is not enrolled with a second factor and is successfully signed in.
            // ...
        } else {
            // The user is a multi-factor user. Second factor challenge is required.
        }
    }];
    

    หากปัจจัยแรกของผู้ใช้เป็นผู้ให้บริการส่วนกลาง เช่น OAuth ให้ตรวจจับข้อผิดพลาดหลังจากเรียก getCredentialWith()

  2. หากผู้ใช้ลงทะเบียนปัจจัยรองไว้หลายปัจจัย ให้สอบถามว่าจะใช้ปัจจัยใด คุณสามารถรับหมายเลขโทรศัพท์ที่ปิดบังด้วย resolver.hints[selectedIndex].phoneNumber และชื่อที่แสดงด้วย resolver.hints[selectedIndex].displayName

    Swift

    // Ask user which second factor to use. Then:
    if resolver.hints[selectedIndex].factorID == PhoneMultiFactorID {
      // User selected a phone second factor.
      // ...
    } else {
      // Unsupported second factor.
      // Note that only phone second factors are currently supported.
    }
    

    วัตถุประสงค์-C

    FIRMultiFactorResolver *resolver =
        (FIRMultiFactorResolver *) error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
    
    // Ask user which second factor to use. Then:
    FIRPhoneMultiFactorInfo *hint = (FIRPhoneMultiFactorInfo *) resolver.hints[selectedIndex];
    if (hint.factorID == FIRPhoneMultiFactorID) {
      // User selected a phone second factor.
      // ...
    } else {
      // Unsupported second factor.
      // Note that only phone second factors are currently supported.
    }
    
  3. ส่งข้อความยืนยันไปยังโทรศัพท์ของผู้ใช้:

    Swift

    // Send SMS verification code.
    let hint = resolver.hints[selectedIndex] as! PhoneMultiFactorInfo
    PhoneAuthProvider.provider().verifyPhoneNumber(
      with: hint,
      uiDelegate: nil,
      multiFactorSession: resolver.session
    ) { (verificationId, error) in
      // verificationId will be needed for sign-in completion.
    }
    

    วัตถุประสงค์-C

    // Send SMS verification code
    [FIRPhoneAuthProvider.provider
      verifyPhoneNumberWithMultiFactorInfo:hint
      UIDelegate:nil
      multiFactorSession:resolver.session
      completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
        if (error != nil) {
            // Failed to verify phone number.
        }
    }];
    
  4. เมื่อส่งรหัส SMS แล้ว ขอให้ผู้ใช้ตรวจสอบรหัสและใช้เพื่อสร้าง PhoneAuthCredential :

    Swift

    // Ask user for the verification code. Then:
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId!,
      verificationCode: verificationCodeFromUser)
    

    วัตถุประสงค์-C

    // Ask user for the SMS verification code. Then:
    FIRPhoneAuthCredential *credential =
        [FIRPhoneAuthProvider.provider
          credentialWithVerificationID:verificationID
                      verificationCode:verificationCodeFromUser];
    
  5. เริ่มต้นอ็อบเจ็กต์การยืนยันด้วยหนังสือรับรอง:

    Swift

    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    

    วัตถุประสงค์-C

    FIRMultiFactorAssertion *assertion =
        [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
    
  6. แก้ไขการลงชื่อเข้าใช้ จากนั้น คุณจะเข้าถึงผลลัพธ์การลงชื่อเข้าใช้เดิมได้ ซึ่งรวมถึงข้อมูลเฉพาะผู้ให้บริการมาตรฐานและข้อมูลรับรองการตรวจสอบสิทธิ์:

    Swift

    // Complete sign-in. This will also trigger the Auth state listeners.
    resolver.resolveSignIn(with: assertion) { (authResult, error) in
      // authResult 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,
      // authResult.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.
    }
    

    วัตถุประสงค์-C

    // Complete sign-in.
    [resolver resolveSignInWithAssertion:assertion
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                            NSError * _Nullable error) {
        if (error != nil) {
            // User successfully signed in with the second factor phone number.
        }
    }];
    

รหัสด้านล่างแสดงตัวอย่างที่สมบูรณ์ของการลงชื่อเข้าใช้ผู้ใช้แบบหลายปัจจัย:

Swift

Auth.auth().signIn(
  withEmail: email,
  password: password
) { (result, error) in
  let authError = error as NSError?
  if authError?.code == AuthErrorCode.secondFactorRequired.rawValue {
    let resolver =
      authError!.userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver

    // Ask user which second factor to use.
    // ...

    // Then:
    let hint = resolver.hints[selectedIndex] as! PhoneMultiFactorInfo

    // Send SMS verification code
    PhoneAuthProvider.provider().verifyPhoneNumber(
      with: hint,
      uiDelegate: nil,
      multiFactorSession: resolver.session
    ) { (verificationId, error) in
      if error != nil {
        // Failed to verify phone number.
      }
      // Ask user for the SMS verification code.
      // ...

      // Then:
      let credential = PhoneAuthProvider.provider().credential(
        withVerificationID: verificationId!,
        verificationCode: verificationCodeFromUser)
      let assertion = PhoneMultiFactorGenerator.assertion(with: credential)

      // Complete sign-in.
      resolver.resolveSignIn(with: assertion) { (authResult, error) in
        if error != nil {
          // User successfully signed in with the second factor phone number.
        }
      }
    }
  }
}

วัตถุประสงค์-C

[FIRAuth.auth signInWithEmail:email
                     password:password
                   completion:^(FIRAuthDataResult * _Nullable authResult,
                               NSError * _Nullable error) {
    if (error == nil || error.code != FIRAuthErrorCodeSecondFactorRequired) {
        // User is not enrolled with a second factor and is successfully signed in.
        // ...
    } else {
        FIRMultiFactorResolver *resolver =
            (FIRMultiFactorResolver *) error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];

        // Ask user which second factor to use.
        // ...

        // Then:
        FIRPhoneMultiFactorInfo *hint = (FIRPhoneMultiFactorInfo *) resolver.hints[selectedIndex];

        // Send SMS verification code
        [FIRPhoneAuthProvider.provider
          verifyPhoneNumberWithMultiFactorInfo:hint
                                    UIDelegate:nil
                            multiFactorSession:resolver.session
                                    completion:^(NSString * _Nullable verificationID,
                                                NSError * _Nullable error) {
            if (error != nil) {
                // Failed to verify phone number.
            }

            // Ask user for the SMS verification code.
            // ...

            // Then:
            FIRPhoneAuthCredential *credential =
                [FIRPhoneAuthProvider.provider
                  credentialWithVerificationID:verificationID
                              verificationCode:kPhoneSecondFactorVerificationCode];
            FIRMultiFactorAssertion *assertion =
                [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];

            // Complete sign-in.
            [resolver resolveSignInWithAssertion:assertion
                                      completion:^(FIRAuthDataResult * _Nullable authResult,
                                                    NSError * _Nullable error) {
                if (error != nil) {
                    // User successfully signed in with the second factor phone number.
                }
            }];
        }];
    }
}];

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

อะไรต่อไป