Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

ก่อนจะเริ่ม

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

  1. ใน Xcode กับโครงการของคุณเปิดแอปนำทางไปยังไฟล์> สวิฟท์แพคเกจ> เพิ่มแพคเกจการพึ่งพา
  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 ทำได้สองวิธี:

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

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

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

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

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

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

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

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

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

    3. เรียกดูตำแหน่งที่คุณบันทึกสำคัญของคุณให้เลือกและคลิกเปิด เพิ่ม ID ที่สำคัญสำหรับคีย์ (ที่มีอยู่ใน แอปเปิ้ลผู้พัฒนาศูนย์สมาชิก ) และคลิกอัพโหลด

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

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

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

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

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

  2. เลือก: ถ้าคุณต้องการที่จะกำหนดวิธีการที่นำเสนอของคุณ SFSafariViewController หรือ UIWebView เมื่อแสดง reCAPTCHA ให้กับผู้ใช้สร้างชั้นเองที่สอดคล้องกับ FIRAuthUIDelegate โปรโตคอลและผ่านมันไป 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: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 การยืนยันได้ทุกวิธีที่คุณต้องการ วิธีง่ายๆคือการบันทึกรหัสยืนยันกับ 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 วัตถุจากรหัสยืนยันและรหัสผ่านการตรวจสอบและวัตถุที่ signInWithCredential:completion:

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

    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 เมฆ

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

ที่จะได้รับสัญญาณอุปกรณ์ APNs, ใช้ application:didRegisterForRemoteNotificationsWithDeviceToken: วิธีการและในนั้นผ่านอุปกรณ์โทเค็นการ FIRAuth 's setAPNSToken:type: วิธีการ

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 ที่เกี่ยวข้องกับการรับรองความถูกต้องโดยการเรียก FIRAuth 's canHandleNotification: วิธีการ

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, developer should handle it.
}

วัตถุประสงค์-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, developer should handle it.
}

เพื่อจัดการ URL การเปลี่ยนเส้นทางโครงการที่กำหนดเองใช้ application:openURL:sourceApplication:annotation: วิธีการสำหรับอุปกรณ์ที่ใช้ iOS 8 และรุ่นเก่าและ application:openURL:options: วิธีการสำหรับอุปกรณ์ที่ใช้ iOS 9 และใหม่กว่าและในพวกเขาผ่าน URL ไปยัง FIRAuth 's canHandleURL วิธี

Swift

// For iOS 9+
func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
func application(_ application: UIApplication,
                 open url: URL,
                 sourceApplication: String?,
                 annotation: Any) -> Bool {
  if Auth.auth().canHandle(url) {
    Return true
  }
  // URL not auth related, developer should handle it.
}

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

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

// For iOS 8-
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

หากคุณกำลังใช้ SwiftUI หรือ UISceneDelegate เพื่อจัดการ URL การเปลี่ยนเส้นทางที่ใช้ scene:openURLContexts: วิธีการและในพวกเขาผ่าน URL เพื่อ FIRAuth 's canHandleURL วิธี

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, developer should handle it.
}

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

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

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

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

  • ในปพลิเคชันของคุณคุณจะได้รับข้อมูลรายละเอียดของผู้ใช้พื้นฐานจาก FIRUser วัตถุ ดู การจัดการผู้ใช้

  • ในฐานข้อมูล Firebase เรียลไทม์และการจัดเก็บเมฆ กฎการรักษาความปลอดภัย , คุณจะได้รับการลงนามใน 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;
}

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