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

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

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

ก่อนเริ่มต้น

  1. หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจากคอนโซล Firebase
  2. ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase

    1. เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่ไฟล์ > เพิ่มแพ็กเกจ
    2. เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ SDK สำหรับแพลตฟอร์ม Firebase ของ Apple ดังนี้
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. เลือกไลบรารีการตรวจสอบสิทธิ์ Firebase
    5. เพิ่มแฟล็ก -ObjC ลงในส่วนแฟล็ก Linker อื่นๆ ของการตั้งค่าบิลด์ของเป้าหมาย
    6. เมื่อเสร็จสิ้นแล้ว Xcode จะเริ่มแก้ปัญหาและดาวน์โหลดทรัพยากร Dependency ในเบื้องหลังโดยอัตโนมัติ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      ภาพหน้าจอของอินเทอร์เฟซการตั้งค่ารูปแบบ URL ที่กําหนดเองของ Xcode
  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
          // ...
      }

    Objective-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 ครั้งที่ 2 เว้นแต่คำขอเดิมจะหมดเวลา

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

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

    Swift

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

    Objective-C

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

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

    Swift

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

    Objective-C

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

    จากนั้นคุณจะคืนค่าค่าที่บันทึกไว้ได้โดยทำดังนี้

    Swift

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

    Objective-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
    )

    Objective-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
        // ...
    }

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

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

การทดสอบการผสานรวม

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

ใน iOS ต้องตั้งค่า appVerificationDisabledForTesting เป็น TRUE ก่อนที่จะโทรหา verifyPhoneNumber ซึ่งระบบจะประมวลผลโดยไม่ต้องใช้โทเค็น APN หรือส่งข้อความ Push แบบไม่มีเสียงในเบื้องหลัง ซึ่งช่วยให้ทดสอบในเครื่องมือจำลองได้ง่ายขึ้น การดำเนินการนี้จะปิดใช้ขั้นตอนสำรองสำหรับ 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
    }];
}];

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

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

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

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

หากต้องการรับโทเค็นอุปกรณ์ APNs ให้ใช้เมธอด application(_:didRegisterForRemoteNotificationsWithDeviceToken:) แล้วส่งโทเค็นอุปกรณ์ไปยังเมธอด setAPNSToken(_:type:) ของ 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
  // ...
}

Objective-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.
}

ในการจัดการข้อความ Push ในเมธอด 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.
}

Objective-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

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

Objective-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 ไปยังเมธอด Auth ของ 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; it should be handled separately.
}

Objective-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 คุณจะรับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth ได้ และใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

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

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

Swift

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

Objective-C

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

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