Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

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

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

  1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
  2. เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ Firebase Apple platforms SDK:
  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 Authentication:

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

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

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

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

    สวิฟต์

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

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

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

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

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

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

นอกจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี 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 ใช้วิธีการหมุนเพื่อรับโทเค็น 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 โดยเรียกเมธอด 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 Realtime Database และ Cloud Storage คุณสามารถรับ 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;
}

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