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

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

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

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

ก่อนจะเริ่ม

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ในการเปิดใช้ Firebase SDK เพื่อใช้การยืนยัน reCAPTCHA:

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

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

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

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

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

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

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

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

    Swift

    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 เป็น reentrant: หากคุณเรียกใช้หลายครั้ง เช่น ในวิธีการ onAppear ของมุมมอง วิธี verifyPhoneNumber จะไม่ส่ง SMS ที่สอง เว้นแต่คำขอเดิมจะหมดเวลา

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

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

    Swift

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

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

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

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

    Swift

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

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

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

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

    Swift

    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 จากรหัสยืนยันและ ID การตรวจสอบ

    Swift

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

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

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

    Swift

    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 Services
  • เขียนการทดสอบการรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยซึ่งปกติแล้วจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมที่ใช้งานจริง

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

  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 Services

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

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

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

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

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

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

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

Swift

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 ใช้วิธีการสลับไปมาเพื่อรับโทเค็น APN ของแอปของคุณโดยอัตโนมัติ เพื่อจัดการข้อความ Push แบบเงียบที่ Firebase ส่งไปยังแอปของคุณ และเพื่อสกัดกั้นการเปลี่ยนเส้นทางแบบแผนที่กำหนดเองโดยอัตโนมัติจากหน้าการยืนยัน reCAPTCHA ระหว่างการตรวจสอบ

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

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

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

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

Swift

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 โดยเรียก canHandleNotification(_:) ของ Auth

Swift

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 ของ Auth

Swift

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

Swift

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 และสามารถใช้ระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ของคุณ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม

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

  • ในฐานข้อมูล Firebase Realtime Database และ Cloud Storage Security Rules คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้

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

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

Swift

    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;
}

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