Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

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

  1. เพิ่ม Firebase ในโปรเจ็กต์ iOS ของคุณ
  2. รวม Podfile ต่อไปนี้ใน Podfile ของคุณ:
    pod 'Firebase/Auth'
    
  3. หากคุณยังไม่ได้เชื่อมต่อแอปกับโครงการ 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 โปรดดูการ กำหนดค่า APN ด้วย FCM

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. โทร verifyPhoneNumber:UIDelegate:completion: หมายเลขโทรศัพท์ 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:UIDelegate:completion: หมายเลข verifyPhoneNumber:UIDelegate:completion: Firebase จะส่งการแจ้งเตือนแบบไม่มีเสียงไปยังแอปของคุณหรือออกคำท้า reCAPTCHA ให้กับผู้ใช้ หลังจากที่แอปของคุณได้รับการแจ้งเตือนหรือผู้ใช้ตอบคำถาม reCAPTCHA เสร็จแล้ว Firebase จะส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุและส่งรหัสยืนยันไปยังฟังก์ชันการดำเนินการให้เสร็จสมบูรณ์ คุณจะต้องใช้ทั้งรหัสยืนยันและรหัสยืนยันเพื่อลงชื่อเข้าใช้ผู้ใช้

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

    รวดเร็ว

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

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

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

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

    รวดเร็ว

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

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

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

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

    รวดเร็ว

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

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

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

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

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

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

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

    รวดเร็ว

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

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

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

    รวดเร็ว

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

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

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

ทดสอบด้วยหมายเลขโทรศัพท์ที่อนุญาตพิเศษ

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

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

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

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

เพิ่มหมายเลขโทรศัพท์และรหัสยืนยันที่อนุญาต

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

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

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

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

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

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

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

นอกเหนือจากการทดสอบด้วยตนเองแล้ว Firebase 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

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

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

รวดเร็ว

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 canHandleNotification:

รวดเร็ว

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: method สำหรับอุปกรณ์ที่ใช้ iOS 8 ขึ้นไปและ application:openURL:options: method สำหรับอุปกรณ์ที่ใช้ iOS 9 และใหม่กว่าและในนั้นให้ส่งผ่าน URL ไปยัง FIRAuth ของ canHandleURL

รวดเร็ว

// 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: method และส่ง URL ไปยัง FIRAuth ของ canHandleURL

รวดเร็ว

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:

รวดเร็ว

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

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