ตรวจสอบสิทธิ์กับ Firebase บนแพลตฟอร์ม Apple โดยใช้หมายเลขโทรศัพท์

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

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

ก่อนที่คุณจะเริ่ม

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการพึ่งพา Firebase

  1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Package
  2. เมื่อได้รับแจ้ง ให้เพิ่มพื้นที่เก็บข้อมูล SDK แพลตฟอร์ม Firebase Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. เลือกไลบรารี Firebase Authentication
  5. เพิ่มแฟล็ก -ObjC ไปยังส่วน Other Linker Flags ของการตั้งค่า build ของเป้าหมายของคุณ
  6. เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง
และตรวจสอบขั้นตอนการกำหนดค่า:
  1. หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase

ข้อกังวลด้านความปลอดภัย

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

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

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

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

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

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

เปิดใช้งานการตรวจสอบแอป

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

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

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

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

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

เริ่มรับการแจ้งเตือนแบบเงียบ ๆ

หากต้องการเปิดใช้งานการแจ้งเตือน APN เพื่อใช้กับ Firebase Authentication:

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

    1. ภายในโปรเจ็กต์ของคุณในคอนโซล Firebase ให้เลือกไอคอนรูปเฟือง เลือก การตั้งค่าโปรเจ็กต์ จากนั้นเลือกแท็บ Cloud Messaging

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

    3. เรียกดูตำแหน่งที่คุณบันทึกกุญแจไว้ เลือกแล้วคลิก เปิด เพิ่ม ID คีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center ) แล้วคลิก อัปโหลด

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

ตั้งค่าการยืนยัน reCAPTCHA

หากต้องการเปิดใช้งาน Firebase SDK เพื่อใช้การตรวจสอบ reCAPTCHA ให้ทำดังนี้

  1. เพิ่มโครงร่าง URL ที่กำหนดเองให้กับโปรเจ็กต์ Xcode ของคุณ:
    1. เปิดการกำหนดค่าโครงการของคุณ: คลิกสองครั้งที่ชื่อโครงการในมุมมองต้นไม้ด้านซ้าย เลือกแอปของคุณจากส่วน เป้าหมาย จากนั้นเลือกแท็บ ข้อมูล และขยายส่วน ประเภท URL
    2. คลิกปุ่ม + และเพิ่ม ID แอปที่เข้ารหัสของคุณเป็นรูปแบบ URL คุณสามารถค้นหา ID ของแอปที่เข้ารหัสได้ในหน้า การตั้งค่าทั่วไป ของคอนโซล Firebase ในส่วนสำหรับแอป iOS ของคุณ ปล่อยให้ช่องอื่นๆ ว่างไว้

      เมื่อเสร็จแล้ว การกำหนดค่าของคุณควรมีลักษณะคล้ายกับตัวอย่างต่อไปนี้ (แต่ด้วยค่าเฉพาะแอปพลิเคชันของคุณ):

      ภาพหน้าจอของอินเทอร์เฟซการตั้งค่ารูปแบบ URL ที่กำหนดเองของ Xcode
  2. ทางเลือกเสริม : หากคุณต้องการปรับแต่งวิธีที่แอปนำเสนอ SFSafariViewController เมื่อแสดง reCAPTCHA ให้กับผู้ใช้ ให้สร้างคลาสแบบกำหนดเองที่สอดคล้องกับโปรโตคอล AuthUIDelegate และส่งผ่านไปยัง verifyPhoneNumber(_:uiDelegate:completion:)

ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้

หากต้องการเริ่มต้นการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซแก่ผู้ใช้ที่แจ้งให้ระบุหมายเลขโทรศัพท์ จากนั้นโทรไปที่ verifyPhoneNumber(_:uiDelegate:completion:) เพื่อขอให้ Firebase ส่งรหัสการตรวจสอบสิทธิ์ไปยังโทรศัพท์ของผู้ใช้ทาง SMS:

  1. รับหมายเลขโทรศัพท์ของผู้ใช้

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

  2. โทร verifyPhoneNumber(_:uiDelegate:completion:) โดยส่งหมายเลขโทรศัพท์ของผู้ใช้ไปให้

    สวิฟท์

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

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

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    เมธอด verifyPhoneNumber กลับมาอีกครั้ง: หากคุณเรียกใช้หลายครั้ง เช่น ในเมธอด onAppear ของมุมมอง verifyPhoneNumber จะไม่ส่ง SMS ครั้งที่สอง เว้นแต่คำขอเดิมจะหมดเวลา

    เมื่อคุณโทร verifyPhoneNumber(_:uiDelegate:completion:) Firebase จะส่งการแจ้งเตือนแบบพุชแบบไม่มีเสียงไปยังแอปของคุณ หรือส่งคำถาม reCAPTCHA ให้กับผู้ใช้ หลังจากที่แอปของคุณได้รับการแจ้งเตือนหรือผู้ใช้ตอบคำถาม reCAPTCHA เรียบร้อยแล้ว Firebase จะส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุ และส่งรหัสยืนยันไปยังฟังก์ชันการทำงานให้เสร็จสมบูรณ์ของคุณ คุณจะต้องมีทั้งรหัสยืนยันและรหัสยืนยันเพื่อลงชื่อเข้าใช้ผู้ใช้

    ข้อความ SMS ที่ส่งโดย Firebase ยังสามารถแปลเป็นภาษาท้องถิ่นได้โดยการระบุภาษาการรับรองความถูกต้องผ่านคุณสมบัติ languageCode บนอินสแตนซ์ Auth ของคุณ

    สวิฟท์

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

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

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. บันทึกรหัสยืนยันและกู้คืนเมื่อแอปของคุณโหลด การทำเช่นนี้ช่วยให้มั่นใจได้ว่าคุณยังคงมีรหัสยืนยันที่ถูกต้อง หากแอปของคุณถูกยกเลิกก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ให้เสร็จสิ้น (เช่น ขณะเปลี่ยนมาใช้แอป SMS)

    คุณสามารถคงรหัสยืนยันไว้ได้ตามที่คุณต้องการ วิธีง่ายๆ คือบันทึก ID การตรวจสอบด้วยออบเจ็กต์ NSUserDefaults :

    สวิฟท์

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

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

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    จากนั้น คุณสามารถคืนค่าที่บันทึกไว้ได้:

    สวิฟท์

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

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

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

หากการเรียกเพื่อ verifyPhoneNumber(_:uiDelegate:completion:) สำเร็จ คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเมื่อได้รับในข้อความ SMS

ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน

หลังจากที่ผู้ใช้มอบรหัสยืนยันจากข้อความ SMS ให้แอปของคุณแล้ว ให้ลงชื่อเข้าใช้ผู้ใช้โดยสร้างออบเจ็กต์ FIRPhoneAuthCredential จากรหัสยืนยันและ ID ยืนยัน แล้วส่งออบเจ็กต์นั้นไปที่ signInWithCredential:completion:

  1. รับรหัสยืนยันจากผู้ใช้
  2. สร้างออบเจ็กต์ FIRPhoneAuthCredential จากรหัสยืนยันและรหัสยืนยัน

    สวิฟท์

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

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

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. ลงชื่อเข้าใช้ผู้ใช้ด้วยวัตถุ FIRPhoneAuthCredential :

    สวิฟท์

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

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

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

ทดสอบด้วยหมายเลขโทรศัพท์สมมติ

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

  • ทดสอบการรับรองความถูกต้องหมายเลขโทรศัพท์โดยไม่ต้องใช้โควต้าการใช้งานของคุณ
  • ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ต้องส่งข้อความ SMS จริง
  • ทำการทดสอบติดต่อกันด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่ถูกควบคุมปริมาณ ซึ่งจะช่วยลดความเสี่ยงที่จะถูกปฏิเสธในระหว่างกระบวนการตรวจสอบ App Store หากผู้ตรวจสอบบังเอิญใช้หมายเลขโทรศัพท์เดียวกันในการทดสอบ
  • ทดสอบพร้อมในสภาพแวดล้อมการพัฒนาโดยไม่ต้องใช้ความพยายามเพิ่มเติม เช่น ความสามารถในการพัฒนาในโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องใช้บริการ Google Play
  • เขียนการทดสอบการรวมระบบโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยที่ปกติใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมการใช้งานจริง

หมายเลขโทรศัพท์ปลอมต้องเป็นไปตามข้อกำหนดเหล่านี้:

  1. ตรวจสอบให้แน่ใจว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นมาจริงๆ และไม่มีอยู่จริง การตรวจสอบสิทธิ์ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบของสหรัฐอเมริกา เช่น +1 650-555-3434
  2. หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
  3. คุณสามารถเพิ่มหมายเลขโทรศัพท์เพื่อการพัฒนาได้สูงสุด 10 หมายเลข
  4. ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่เดายากและเปลี่ยนบ่อยๆ

สร้างหมายเลขโทรศัพท์และรหัสยืนยันสมมติ

  1. ใน คอนโซล Firebase ให้เปิดส่วน การตรวจสอบสิทธิ์
  2. ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้เปิดใช้งาน
  3. เปิด หมายเลขโทรศัพท์เพื่อทดสอบ เมนูหีบเพลง
  4. ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
  5. ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขนั้น เช่น 654321
  6. เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ

การทดสอบด้วยตนเอง

คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในใบสมัครของคุณได้โดยตรง วิธีนี้ช่วยให้คุณทำการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาได้โดยไม่มีปัญหาเรื่องโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากเครื่องจำลอง iOS หรือเครื่องจำลอง Android โดยไม่ต้องติดตั้งบริการ Google Play

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

เมื่อลงชื่อเข้าใช้เสร็จแล้ว ผู้ใช้ Firebase จะถูกสร้างขึ้นด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีพฤติกรรมและคุณสมบัติเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึง Realtime Database/Cloud Firestore และบริการอื่นๆ ได้ในลักษณะเดียวกัน โทเค็น ID ที่สร้างขึ้นในระหว่างกระบวนการนี้มีลายเซ็นเดียวกับผู้ใช้หมายเลขโทรศัพท์จริง

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

การทดสอบบูรณาการ

นอกเหนือจากการทดสอบด้วยตนเองแล้ว การตรวจสอบสิทธิ์ Firebase ยังมี API เพื่อช่วยเขียนการทดสอบการรวมสำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้ปิดใช้การตรวจสอบแอปโดยปิดใช้ข้อกำหนด reCAPTCHA ในเว็บและการแจ้งเตือนแบบพุชใน iOS ซึ่งทำให้การทดสอบอัตโนมัติเป็นไปได้ในโฟลว์เหล่านี้และนำไปใช้งานได้ง่ายขึ้น นอกจากนี้ยังช่วยให้สามารถทดสอบขั้นตอนการยืนยันได้ทันทีบน Android

บน iOS การตั้งค่า appVerificationDisabledForTesting จะต้องตั้งค่าเป็น TRUE ก่อนที่จะเรียก verifyPhoneNumber สิ่งนี้ได้รับการประมวลผลโดยไม่ต้องใช้โทเค็น APN ใดๆ หรือส่งการแจ้งเตือนแบบพุชแบบเงียบๆ ในเบื้องหลัง ทำให้ทดสอบในเครื่องจำลองได้ง่ายขึ้น นอกจากนี้ยังปิดใช้โฟลว์สำรอง reCAPTCHA ด้วย

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

สวิฟท์

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

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

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

ภาคผนวก: การใช้การลงชื่อเข้าใช้โทรศัพท์โดยไม่ต้องสลับไปมา

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

หากคุณไม่ต้องการใช้ swizzling คุณสามารถปิดการใช้งานได้โดยเพิ่มแฟล็ก FirebaseAppDelegateProxyEnabled ให้กับไฟล์ Info.plist ของแอปของคุณ และตั้งค่าเป็น NO โปรดทราบว่าการตั้งค่าสถานะนี้เป็น NO จะปิดใช้การสลับสำหรับผลิตภัณฑ์ Firebase อื่นๆ รวมถึง Firebase Cloud Messaging

หากคุณปิดใช้งาน Swizzling คุณต้องส่งโทเค็นอุปกรณ์ APN การแจ้งเตือนแบบพุช และ URL การเปลี่ยนเส้นทางรูปแบบที่กำหนดเองไปยัง Firebase Authentication อย่างชัดเจน

หากคุณกำลังสร้างแอปพลิเคชัน SwiftUI คุณควรส่งโทเค็นอุปกรณ์ APN การแจ้งเตือนแบบพุช และ URL เปลี่ยนเส้นทางรูปแบบที่กำหนดเองไปยัง Firebase Authentication อย่างชัดเจน

หากต้องการรับโทเค็นอุปกรณ์ APN ให้ใช้เมธอด application(_:didRegisterForRemoteNotificationsWithDeviceToken:) จากนั้นส่งโทเค็นอุปกรณ์ไปยัง setAPNSToken(_:type:) ของ Auth

สวิฟท์

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

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

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

ในการจัดการการแจ้งเตือนแบบพุช ในเมธอด application(_:didReceiveRemoteNotification:fetchCompletionHandler:): ให้ตรวจสอบการแจ้งเตือนที่เกี่ยวข้องกับ Firebase auth โดยการเรียกเมธอด canHandleNotification(_:) ของ Auth

สวิฟท์

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

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

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

ในการจัดการ URL การเปลี่ยนเส้นทางรูปแบบที่กำหนดเอง ให้ใช้เมธอด application(_:open:options:) และส่ง URL ไปยัง canHandleURL(_:) ของ Auth

สวิฟท์

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

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

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

หากคุณใช้ SwiftUI หรือ UISceneDelegate เพื่อจัดการ URL การเปลี่ยนเส้นทาง ให้ใช้เมธอด scene(_:openURLContexts:) และส่ง URL ไปยัง canHandleURL(_:) ของ Auth

สวิฟท์

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

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

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

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

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

  • ในแอปของคุณ คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์ User ดู จัดการผู้ใช้

  • ในฐานข้อมูลเรียลไทม์ Firebase และ กฎความปลอดภัยของ พื้นที่เก็บข้อมูลบนคลาวด์ คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้

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

หากต้องการออกจากระบบผู้ใช้ ให้โทร signOut:

สวิฟท์

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

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

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

คุณอาจต้องการเพิ่มรหัสการจัดการข้อผิดพลาดสำหรับข้อผิดพลาดในการรับรองความถูกต้องทั้งหมด ดู การจัดการข้อผิดพลาด