Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Xác thực với Firebase trên Nền tảng Apple bằng Số điện thoại

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Bạn có thể sử dụng Xác thực Firebase để đăng nhập người dùng bằng cách gửi tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong tin nhắn SMS.

Cách dễ nhất để thêm đăng nhập bằng số điện thoại vào ứng dụng của bạn là sử dụng FirebaseUI , bao gồm tiện ích đăng nhập thả xuống triển khai các luồng đăng nhập cho đăng nhập bằng số điện thoại, cũng như đăng nhập dựa trên mật khẩu và đăng nhập có liên kết -Trong. Tài liệu này mô tả cách triển khai quy trình đăng nhập bằng số điện thoại bằng SDK Firebase.

Trước khi bắt đầu

Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.

  1. Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy điều hướng đến File > Add Packages .
  2. Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Chọn thư viện Xác thực Firebase.
  5. Khi hoàn tất, Xcode sẽ tự động bắt đầu giải quyết và tải xuống các phần phụ thuộc của bạn trong nền.
Và, kiểm tra một bước cấu hình:
  1. Nếu bạn chưa kết nối ứng dụng của mình với dự án Firebase, hãy thực hiện việc này từ bảng điều khiển Firebase .

mối quan tâm an ninh

Xác thực chỉ sử dụng một số điện thoại, mặc dù thuận tiện, nhưng lại kém an toàn hơn so với các phương pháp khả dụng khác, bởi vì việc sở hữu một số điện thoại có thể dễ dàng chuyển giao giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều hồ sơ người dùng, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào tài khoản bằng số điện thoại của thiết bị.

Nếu bạn sử dụng tính năng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, thì bạn nên cung cấp tính năng này cùng với các phương thức đăng nhập an toàn hơn và thông báo cho người dùng về những đánh đổi bảo mật khi sử dụng tính năng đăng nhập bằng số điện thoại.

Bật đăng nhập Số điện thoại cho dự án Firebase của bạn

Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật phương thức đăng nhập bằng Số điện thoại cho dự án Firebase của mình:

  1. Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
  2. Trên trang Phương thức đăng nhập, bật phương thức đăng nhập Số điện thoại .

Hạn ngạch yêu cầu đăng nhập bằng số điện thoại của Firebase đủ cao để hầu hết các ứng dụng không bị ảnh hưởng. Tuy nhiên, nếu bạn cần đăng nhập một lượng lớn người dùng bằng xác thực qua điện thoại, bạn có thể cần phải nâng cấp gói giá của mình. Xem trang giá cả .

Bật xác minh ứng dụng

Để sử dụng xác thực số điện thoại, Firebase phải có khả năng xác minh rằng các yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. Có hai cách Xác thực Firebase thực hiện việc này:

  • Thông báo APN im lặng : Khi bạn đăng nhập người dùng bằng số điện thoại của họ lần đầu tiên trên thiết bị, Xác thực Firebase sẽ gửi mã thông báo đến thiết bị bằng cách sử dụng thông báo đẩy im lặng. Nếu ứng dụng của bạn nhận thành công thông báo từ Firebase, thì quá trình đăng nhập bằng số điện thoại có thể tiếp tục.

    Đối với iOS 8.0 trở lên, thông báo im lặng không yêu cầu sự đồng ý rõ ràng của người dùng và do đó không bị ảnh hưởng bởi người dùng từ chối nhận thông báo APN trong ứng dụng. Do đó, ứng dụng không cần yêu cầu quyền của người dùng để nhận thông báo đẩy khi triển khai xác thực số điện thoại Firebase.

  • xác minh reCAPTCHA : Trong trường hợp không thể gửi hoặc nhận thông báo đẩy im lặng, chẳng hạn như khi người dùng đã tắt tính năng làm mới nền cho ứng dụng của bạn hoặc khi thử nghiệm ứng dụng của bạn trên trình giả lập iOS, thì Xác thực Firebase sẽ sử dụng xác minh reCAPTCHA để hoàn thành điện thoại luồng đăng nhập. Thử thách reCAPTCHA thường có thể được hoàn thành mà người dùng không cần phải giải quyết bất cứ điều gì.

Khi thông báo đẩy im lặng được định cấu hình đúng cách, chỉ một tỷ lệ rất nhỏ người dùng sẽ trải nghiệm quy trình reCAPTCHA. Tuy nhiên, bạn nên đảm bảo rằng tính năng đăng nhập bằng số điện thoại hoạt động chính xác cho dù có thông báo đẩy im lặng hay không.

Bắt đầu nhận thông báo im lặng

Để bật thông báo APN để sử dụng với Xác thực Firebase:

  1. Trong Xcode, bật thông báo đẩy cho dự án của bạn.
  2. Tải khóa xác thực APN của bạn lên Firebase. Nếu bạn chưa có khóa xác thực APN, hãy đảm bảo tạo một khóa trong Trung tâm thành viên nhà phát triển của Apple .

    1. Bên trong dự án của bạn trong bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án rồi chọn tab Nhắn tin qua đám mây .

    2. Trong khóa xác thực APN bên dưới cấu hình ứng dụng iOS , hãy nhấp vào nút Tải lên .

    3. Duyệt đến vị trí mà bạn đã lưu khóa của mình, chọn nó và nhấp vào Mở . Thêm ID khóa cho khóa (có sẵn trong Trung tâm thành viên dành cho nhà phát triển của Apple ) và nhấp vào Tải lên .

    Nếu bạn đã có chứng chỉ APN, bạn có thể tải chứng chỉ lên để thay thế.

Thiết lập xác minh reCAPTCHA

Để bật SDK Firebase sử dụng xác minh reCAPTCHA:

  1. Thêm lược đồ URL tùy chỉnh vào dự án Xcode của bạn:
    1. Mở cấu hình dự án của bạn: nhấp đúp vào tên dự án ở chế độ xem dạng cây bên trái. Chọn ứng dụng của bạn từ phần MỤC TIÊU , sau đó chọn tab Thông tin và mở rộng phần Loại URL .
    2. Nhấp vào nút + và thêm lược đồ URL cho ID ứng dụng khách bị đảo ngược của bạn. Để tìm giá trị này, hãy mở tệp cấu hình GoogleService-Info.plist và tìm khóa REVERSED_CLIENT_ID . Sao chép giá trị của khóa đó và dán vào hộp Lược đồ URL trên trang cấu hình. Để trống các trường khác.

      Khi hoàn tất, cấu hình của bạn sẽ trông giống như sau (nhưng với các giá trị dành riêng cho ứng dụng của bạn):

  2. Tùy chọn : Nếu bạn muốn tùy chỉnh cách ứng dụng của mình trình bày SFSafariViewController khi hiển thị reCAPTCHA cho người dùng, hãy tạo một lớp tùy chỉnh tuân theo giao thức AuthUIDelegate và chuyển lớp đó tới verifyPhoneNumber(_:uiDelegate:completion:) .

Gửi mã xác minh đến điện thoại của người dùng

Để bắt đầu đăng nhập bằng số điện thoại, hãy cung cấp cho người dùng một giao diện nhắc họ cung cấp số điện thoại của mình, sau đó gọi verifyPhoneNumber(_:uiDelegate:completion:) để yêu cầu Firebase gửi mã xác thực tới điện thoại của người dùng bằng SMS:

  1. Lấy số điện thoại của người dùng.

    Các yêu cầu pháp lý khác nhau, nhưng theo phương pháp hay nhất và để đặt kỳ vọng cho người dùng của bạn, bạn nên thông báo cho họ rằng nếu họ sử dụng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và áp dụng mức phí tiêu chuẩn.

  2. Gọi verifyPhoneNumber(_:uiDelegate:completion:) , chuyển đến số điện thoại của người dùng.

    Nhanh

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

    Mục tiêu-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
      // ...
    }];

    Phương thức verifyPhoneNumber được gửi lại: nếu bạn gọi nó nhiều lần, chẳng hạn như trong phương thức onAppear của chế độ xem, thì phương thức verifyPhoneNumber sẽ không gửi SMS thứ hai trừ khi yêu cầu ban đầu đã hết thời gian.

    Khi bạn gọi verifyPhoneNumber(_:uiDelegate:completion:) , Firebase sẽ gửi thông báo đẩy thầm lặng tới ứng dụng của bạn hoặc đưa ra thử thách reCAPTCHA cho người dùng. Sau khi ứng dụng của bạn nhận được thông báo hoặc người dùng hoàn thành thử thách reCAPTCHA, Firebase sẽ gửi một tin nhắn SMS chứa mã xác thực đến số điện thoại đã chỉ định và chuyển ID xác minh đến chức năng hoàn thành của bạn. Bạn sẽ cần cả mã xác minh và ID xác minh để đăng nhập người dùng.

    Tin nhắn SMS do Firebase gửi cũng có thể được bản địa hóa bằng cách chỉ định ngôn ngữ xác thực thông qua thuộc tính languageCode trên phiên bản Auth của bạn.

    Nhanh

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

    Mục tiêu-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Lưu ID xác minh và khôi phục nó khi ứng dụng của bạn tải. Bằng cách đó, bạn có thể đảm bảo rằng mình vẫn có ID xác minh hợp lệ nếu ứng dụng của bạn bị chấm dứt trước khi người dùng hoàn tất quy trình đăng nhập (ví dụ: trong khi chuyển sang ứng dụng SMS).

    Bạn có thể duy trì ID xác minh theo bất kỳ cách nào bạn muốn. Một cách đơn giản là lưu ID xác minh bằng đối tượng NSUserDefaults :

    Nhanh

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

    Mục tiêu-C

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

    Sau đó, bạn có thể khôi phục giá trị đã lưu:

    Nhanh

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

    Mục tiêu-C

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

Nếu lệnh gọi verifyPhoneNumber(_:uiDelegate:completion:) thành công, bạn có thể nhắc người dùng nhập mã xác minh khi họ nhận được mã đó trong tin nhắn SMS.

Đăng nhập người dùng bằng mã xác minh

Sau khi người dùng cung cấp cho ứng dụng của bạn mã xác minh từ tin nhắn SMS, hãy đăng nhập người dùng bằng cách tạo đối tượng FIRPhoneAuthCredential từ mã xác minh và ID xác minh, đồng thời chuyển đối tượng đó tới signInWithCredential:completion: .

  1. Nhận mã xác minh từ người dùng.
  2. Tạo đối tượng FIRPhoneAuthCredential từ mã xác minh và ID xác minh.

    Nhanh

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

    Mục tiêu-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Đăng nhập người dùng bằng đối tượng FIRPhoneAuthCredential :

    Nhanh

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

    Mục tiêu-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;
      // ...
    }];

Thử nghiệm với số điện thoại hư cấu

Bạn có thể thiết lập các số điện thoại hư cấu để phát triển thông qua bảng điều khiển Firebase. Thử nghiệm với các số điện thoại hư cấu mang lại những lợi ích sau:

  • Kiểm tra xác thực số điện thoại mà không tiêu tốn dung lượng sử dụng của bạn.
  • Kiểm tra xác thực số điện thoại mà không gửi tin nhắn SMS thực.
  • Chạy thử nghiệm liên tiếp với cùng một số điện thoại mà không bị điều chỉnh. Điều này giảm thiểu rủi ro bị từ chối trong quá trình đánh giá Cửa hàng ứng dụng nếu người đánh giá tình cờ sử dụng cùng một số điện thoại để thử nghiệm.
  • Thử nghiệm dễ dàng trong môi trường phát triển mà không cần thêm bất kỳ nỗ lực nào, chẳng hạn như khả năng phát triển trong trình giả lập iOS hoặc trình giả lập Android mà không cần Dịch vụ của Google Play.
  • Viết các bài kiểm tra tích hợp mà không bị chặn bởi kiểm tra bảo mật thường được áp dụng trên các số điện thoại thực trong môi trường sản xuất.

Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:

  1. Đảm bảo rằng bạn sử dụng các số điện thoại thực sự hư cấu và chưa tồn tại. Xác thực Firebase không cho phép bạn đặt các số điện thoại hiện có được người dùng thực sử dụng làm số kiểm tra. Một tùy chọn là sử dụng các số có tiền tố 555 làm số điện thoại thử nghiệm ở Hoa Kỳ, ví dụ: +1 650-555-3434
  2. Số điện thoại phải được định dạng chính xác về độ dài và các ràng buộc khác. Chúng vẫn sẽ trải qua quá trình xác thực giống như số điện thoại của người dùng thực.
  3. Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
  4. Sử dụng các số điện thoại/mã kiểm tra khó đoán và thay đổi chúng thường xuyên.

Tạo số điện thoại hư cấu và mã xác minh

  1. Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
  2. Trong tab Phương thức đăng nhập , hãy bật Nhà cung cấp điện thoại nếu bạn chưa bật.
  3. Mở menu Số điện thoại để kiểm tra đàn accordion.
  4. Cung cấp số điện thoại bạn muốn kiểm tra, ví dụ: +1 650-555-3434 .
  5. Cung cấp mã xác minh gồm 6 chữ số cho số cụ thể đó, ví dụ: 654321 .
  6. Thêm số. Nếu có nhu cầu, bạn có thể xóa số điện thoại và mã của nó bằng cách di chuột vào hàng tương ứng và nhấn vào biểu tượng thùng rác.

Kiểm tra bằng tay

Bạn có thể trực tiếp bắt đầu sử dụng một số điện thoại hư cấu trong ứng dụng của mình. Điều này cho phép bạn thực hiện kiểm tra thủ công trong các giai đoạn phát triển mà không gặp phải các vấn đề về hạn ngạch hoặc điều tiết. Bạn cũng có thể kiểm tra trực tiếp từ trình giả lập iOS hoặc trình giả lập Android mà không cần cài đặt Dịch vụ của Google Play.

Khi bạn cung cấp số điện thoại hư cấu và gửi mã xác minh, sẽ không có tin nhắn SMS thực nào được gửi. Thay vào đó, bạn cần cung cấp mã xác minh đã định cấu hình trước đó để hoàn tất đăng nhập.

Khi hoàn tất đăng nhập, người dùng Firebase được tạo bằng số điện thoại đó. Người dùng có hành vi và thuộc tính giống như người dùng số điện thoại thực và có thể truy cập Cơ sở dữ liệu thời gian thực/Cloud Firestore và các dịch vụ khác theo cùng một cách. Mã thông báo ID được đúc trong quá trình này có chữ ký giống như người dùng số điện thoại thực.

Một tùy chọn khác là đặt vai trò thử nghiệm thông qua xác nhận quyền sở hữu tùy chỉnh đối với những người dùng này để phân biệt họ là người dùng giả mạo nếu bạn muốn hạn chế quyền truy cập hơn nữa.

Thử nghiệm hội nhập

Ngoài thử nghiệm thủ công, Xác thực Firebase cung cấp API để giúp viết các thử nghiệm tích hợp cho thử nghiệm xác thực điện thoại. Các API này vô hiệu hóa xác minh ứng dụng bằng cách vô hiệu hóa yêu cầu reCAPTCHA trên web và thông báo đẩy im lặng trong iOS. Điều này làm cho thử nghiệm tự động hóa có thể thực hiện được trong các luồng này và dễ triển khai hơn. Ngoài ra, chúng giúp cung cấp khả năng kiểm tra các luồng xác minh tức thời trên Android.

Trên iOS, cài đặt appVerificationDisabledForTesting phải được đặt thành TRUE trước khi gọi verifyPhoneNumber . Điều này được xử lý mà không yêu cầu bất kỳ mã thông báo APN nào hoặc gửi thông báo đẩy im lặng trong nền, giúp kiểm tra dễ dàng hơn trong trình giả lập. Điều này cũng vô hiệu hóa quy trình dự phòng reCAPTCHA.

Lưu ý rằng khi xác minh ứng dụng bị vô hiệu hóa, việc sử dụng số điện thoại không hư cấu sẽ không thể hoàn tất đăng nhập. Chỉ số điện thoại hư cấu mới có thể được sử dụng với API này.

Nhanh

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

Mục tiêu-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;
    }];
}];

Phụ lục: Sử dụng đăng nhập bằng điện thoại mà không bị trượt

Xác thực Firebase sử dụng phương thức swizzling để tự động lấy mã thông báo APN của ứng dụng, để xử lý các thông báo đẩy thầm lặng mà Firebase gửi đến ứng dụng của bạn và để tự động chặn chuyển hướng lược đồ tùy chỉnh từ trang xác minh reCAPTCHA trong quá trình xác minh.

Nếu không muốn sử dụng tính năng swizzling, bạn có thể tắt tính năng này bằng cách thêm cờ FirebaseAppDelegateProxyEnabled vào tệp Info.plist của ứng dụng và đặt thành NO . Lưu ý rằng việc đặt cờ này thành NO cũng sẽ vô hiệu hóa tính năng swizzling đối với các sản phẩm Firebase khác, bao gồm cả Firebase Cloud Messaging.

Nếu tắt tính năng swizzling, bạn phải chuyển rõ ràng mã thông báo thiết bị APN, thông báo đẩy và URL chuyển hướng lược đồ tùy chỉnh sang Xác thực Firebase.

Nếu đang xây dựng ứng dụng SwiftUI, bạn cũng nên chuyển rõ ràng mã thông báo thiết bị APN, thông báo đẩy và URL chuyển hướng lược đồ tùy chỉnh sang Xác thực Firebase.

Để lấy mã thông báo thiết bị APN, hãy triển khai phương thức application(_:didRegisterForRemoteNotificationsWithDeviceToken:) và trong đó, chuyển mã thông báo thiết bị cho phương thức Auth 's setAPNSToken(_:type:) .

Nhanh

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

Mục tiêu-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.
}

Để xử lý thông báo đẩy, trong phương thức application(_:didReceiveRemoteNotification:fetchCompletionHandler:): , hãy kiểm tra các thông báo liên quan đến xác thực Firebase bằng cách gọi phương thức Auth 's canHandleNotification(_:) .

Nhanh

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

Mục tiêu-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.
}

Để xử lý URL chuyển hướng lược đồ tùy chỉnh, hãy triển khai phương thức application(_:open:options:) và trong đó, chuyển URL tới phương thức canHandleURL(_:) của Auth .

Nhanh

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

Mục tiêu-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.
}

Nếu bạn đang sử dụng SwiftUI hoặc UISceneDelegate , để xử lý URL chuyển hướng, hãy triển khai phương thức scene(_:openURLContexts:) và trong đó, chuyển URL tới phương thức canHandleURL(_:) của Auth .

Nhanh

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

Mục tiêu-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.
  }
}

Bước tiếp theo

Sau khi người dùng đăng nhập lần đầu tiên, tài khoản người dùng mới được tạo và liên kết với thông tin đăng nhập—nghĩa là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp xác thực—người dùng đã đăng nhập bằng. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

  • Trong các ứng dụng của mình, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng User . Xem Quản lý người dùng .

  • Trong Cơ sở dữ liệu thời gian thực Firebase và Quy tắc bảo mật bộ lưu trữ đám mây , bạn có thể lấy ID người dùng duy nhất của người dùng đã đăng nhập từ biến auth thực và sử dụng biến đó để kiểm soát dữ liệu mà người dùng có thể truy cập.

Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều nhà cung cấp xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp xác thực với tài khoản người dùng hiện có.

Để đăng xuất người dùng, hãy gọi signOut: .

Nhanh

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

Mục tiêu-C

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

Bạn cũng có thể muốn thêm mã xử lý lỗi cho toàn bộ các lỗi xác thực. Xem Xử lý lỗi .