Xác thực bằng Firebase trên các nền tảng của Apple bằng số điện thoại

Bạn có thể sử dụng tính nă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 phương thức đăng nhập bằng số điện thoại vào ứng dụng là sử dụng FirebaseUI, bao gồm tiện ích đăng nhập giúp triển khai quy trình đă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à liên kết. 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 Firebase SDK.

Trước khi bắt đầu

  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 trong bảng điều khiển của Firebase.
  2. 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 Firebase.

    1. Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến File > Add Packages (Tệp > Thêm gói).
    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.git
    4. Chọn thư viện Xác thực Firebase.
    5. Thêm cờ -ObjC vào mục Cờ trình liên kết khác trong chế độ cài đặt bản dựng của mục tiêu.
    6. Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải các phần phụ thuộc của bạn xuống ở chế độ nền.

Các mối lo ngại về bảo mật

Mặc dù thuận tiện nhưng việc xác thực chỉ sử dụng số điện thoại sẽ kém an toàn hơn so với các phương thức khác hiện có, vì người dùng có thể dễ dàng chuyển quyền sở hữu số điện thoại. 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 một tài khoản bằng số điện thoại của thiết bị đó.

Nếu sử dụng phương thức đăng nhập dựa trên số điện thoại trong ứng dụng, 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, đồng thời thông báo cho người dùng về các lợi ích bảo mật khi sử dụng việc đăng nhập bằng số điện thoại.

Bật tính năng đăng nhập bằng 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 bạn:

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

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

Bật tính năng xác minh ứng dụng

Để sử dụng tính năng xác thực số điện thoại, Firebase phải xác minh được 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 có thể thực hiện việc này:

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

    Đố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 nên không bị ảnh hưởng khi 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 người dùng cho phép nhận thông báo đẩy khi triển khai tính năng xác thực số điện thoại trong 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 trong nền cho ứng dụng hoặc khi kiểm thử ứng dụng trên một trình mô phỏng iOS, tính năng Xác thực Firebase sử dụng phương thức xác minh reCAPTCHA để hoàn tất quy trình đăng nhập bằng điện thoại. 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 gì.

Khi thông báo đẩy không hoạt động được định cấu hình đúng cách, chỉ một tỷ lệ rất nhỏ người dùng trải nghiệm quy trình reCAPTCHA. Tuy nhiên, bạn cầ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 bất kể có thông báo đẩy im lặng hay không.

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

Cách bật thông báo APN để dùng với tính năng Xác thực Firebase:

  1. Trong Xcode, hãy bật thông báo đẩy cho dự án của bạn.
  2. Tải khoá xác thực APN của bạn lên Firebase. Nếu bạn chưa có khoá xác thực APN, hãy nhớ tạo một khoá trong Trung tâm thành viên dành cho 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 của Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án, sau đó chọn thẻ Gửi thông báo qua đám mây.

    2. Trong khoá xác thực ANG ở bên dưới phần 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í bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Open (Mở). Thêm mã khoá của khoá (có trong Trung tâm thành viên dành cho nhà phát triển của Apple) rồi nhấp vào Tải lên.

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

Thiết lập phương thức xác minh bằng reCAPTCHA

Cách bật Firebase SDK để sử dụng phương thức xác minh reCAPTCHA:

  1. Thêm giao thức URL tuỳ chỉnh vào dự án Xcode của bạn:
    1. Mở cấu hình dự án: nhấp đúp vào tên dự án trong chế độ xem dạng cây ở bên trái. Chọn ứng dụng của bạn trong mục MỤC TIÊU, sau đó chọn thẻ Thông tin và mở rộng mục Loại URL.
    2. Nhấp vào nút + và thêm Mã ứng dụng được mã hoá dưới dạng lược đồ URL. Bạn có thể tìm thấy Mã ứng dụng được mã hoá trên trang Cài đặt chung của bảng điều khiển của Firebase, trong phần dành cho ứng dụng iOS của bạn. Để trống các trường khác.

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

      Ảnh chụp màn hình giao diện thiết lập lược đồ URL tuỳ chỉnh của Xcode
  2. Không bắt buộc: Nếu bạn muốn tuỳ chỉnh cách ứng dụng thể hiện SFSafariViewController khi hiển thị reCAPTCHA cho người dùng, hãy tạo một lớp tuỳ chỉnh phù hợp với giao thức AuthUIDelegate và truyền lớp đó đến 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 hiển thị cho người dùng một giao diện nhắc họ cung cấp số điện thoại, 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 tin nhắn SMS:

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

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

  2. Gọi verifyPhoneNumber(_:uiDelegate:completion:), truyền tới đó số điện thoại của người dùng.

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

    Phương thức verifyPhoneNumber là phương thức khởi tạo lại: nếu bạn gọi phương thức này nhiều lần, chẳng hạn như trong phương thức onAppear của một khung hiển thị, thì phương thức verifyPhoneNumber sẽ không gửi tin nhắn SMS thứ hai trừ phi đã hết thời gian chờ cho yêu cầu ban đầu.

    Khi bạn gọi verifyPhoneNumber(_:uiDelegate:completion:), Firebase sẽ gửi thông báo đẩy không có âm thanh đến ứ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 được chỉ định và chuyển mã xác minh đến hàm hoàn thành của bạn. Bạn sẽ cần cả mã xác minh và mã xác minh để đăng nhập vào người dùng.

    Bạn cũng có thể bản địa hoá tin nhắn SMS do Firebase gửi bằng cách chỉ định ngôn ngữ xác thực thông qua thuộc tính languageCode trên thực thể Xác thực.

    Swift

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

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Lưu mã xác minh và khôi phục khi ứng dụng của bạn tải xong. Bằng cách này, bạn có thể đảm bảo rằng mình vẫn có mã 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ụ: khi chuyển sang ứng dụng SMS).

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

    Swift

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

    Objective-C

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

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

    Swift

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

    Objective-C

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

Nếu lệnh gọi đến 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 trong tin nhắn SMS, hãy đăng nhập người dùng bằng cách tạo một đối tượng FIRPhoneAuthCredential từ mã xác minh và mã xác minh, rồi truyền đối tượng đó đến 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à mã xác minh.

    Swift

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

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Đăng nhập vào người dùng bằng đối tượng 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;
      // ...
    }];

Thử nghiệm bằng số điện thoại giả định

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

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

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

  1. Đảm bảo bạn sử dụng số điện thoại thực sự là giả tưởng và chưa tồn tại. Tính năng Xác thực Firebase không cho phép bạn đặt số điện thoại hiện có mà người dùng thực sử dụng làm số thử nghiệm. Một lựa 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 theo độ dài và các hạn chế khác. Chúng vẫn sẽ được 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. Hãy sử dụng số điện thoại/mã thử nghiệm khó đoán và thay đổi thường xuyên.

Tạo số điện thoại giả và mã xác minh

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

Kiểm thử theo cách thủ công

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 đơn đăng ký của mình. Nhờ đó, bạn có thể kiểm thử thủ công trong các giai đoạn phát triển mà không gặp phải vấn đề về hạn mức hoặc điều tiết. Bạn cũng có thể kiểm thử trực tiếp từ trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần cài đặt Dịch vụ Google Play.

Khi bạn cung cấp số điện thoại giả 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 quá trình đăng nhập.

Khi hoàn tất đăng nhập, người dùng Firebase sẽ đượ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 vào Cơ sở dữ liệu theo thời gian thực/Cloud Firestore cũng như các dịch vụ khác theo cách tương tự. Mã thông báo mã nhận dạng được tạo trong quá trình này có cùng chữ ký với một người dùng số điện thoại thực.

Một lựa chọn khác là đặt vai trò thử nghiệm thông qua thông báo xác nhận quyền sở hữu tuỳ 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ế hơn nữa quyền truy cập.

Kiểm thử tích hợp

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

Trên iOS, bạn phải đặt chế độ cài đặt appVerificationDisabledForTesting thành TRUE trước khi gọi verifyPhoneNumber. Việc này được xử lý mà không yêu cầu mã thông báo APN hoặc gửi thông báo đẩy im lặng ở chế độ nền, giúp bạn dễ dàng kiểm thử trong trình mô phỏng. Thao tác này cũng vô hiệu hoá quy trình dự phòng reCAPTCHA.

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

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

Phụ lục: Sử dụng phương thức đăng nhập trên điện thoại mà không nhấp nháy

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

Nếu không muốn sử dụng phương thức xoáy, 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 hoá hiện tượng xoáy tròn cho các sản phẩm Firebase khác, bao gồm cả Giải pháp gửi thông báo qua đám mây của Firebase.

Nếu tắt tính năng làm tròn, bạn phải truyề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 đồ tuỳ chỉnh đến tính năng Xác thực Firebase.

Nếu đang tạo ứ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 đồ tuỳ chỉnh đến tính năng 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:), trong đó, hãy truyền mã thông báo thiết bị vào phương thức setAPNSToken(_:type:) của 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.
}

Để 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 tính năng xác thực Firebase bằng cách gọi phương thức canHandleNotification(_:) của 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.
}

Để xử lý URL chuyển hướng lược đồ tuỳ chỉnh, hãy triển khai phương thức application(_:open:options:) và trong các URL đó, hãy chuyển URL đến phương thức canHandleURL(_:) của 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.
}

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 các phương thức đó, hãy chuyển URL đến phương thức canHandleURL(_:) của Auth.

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

Các bước tiếp theo

Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin đăng nhập (chẳng hạn như tên người dùng và mật khẩu, số điện thoại hoặc thông tin của nhà cung cấp dịch vụ xác thực) mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ như một phần trong dự án Firebase và có thể được 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, 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 phần Quản lý người dùng.

  • Trong Quy tắc bảo mật của Cloud Storage và Cơ sở dữ liệu theo thời gian thực của Firebase, bạn có thể lấy mã nhận dạng người dùng riêng biệt của người dùng đã đăng nhập từ biến auth rồi sử dụng mã này để kiểm soát những 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 thông qua nhiều nhà cung cấp dịch vụ xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp dịch vụ xác thực với một tài khoản người dùng hiện có.

Để đăng xuất một người dùng, hãy gọi 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;
}

Bạn cũng nên thêm mã xử lý lỗi cho toàn bộ các lỗi xác thực. Hãy xem bài viết Xử lý lỗi.