Xác thực bằng Firebase bằng Tài khoản dựa trên mật khẩu trên các nền tảng của Apple

Bạn có thể dùng Firebase Authentication để cho phép người dùng xác thực bằng Firebase bằng địa chỉ email và mật khẩu của họ, đồng thời quản lý các tài khoản dựa trên mật khẩu của ứng dụng.

Trước khi bắt đầu

Sử dụng Swift Package Manager để 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 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 Firebase Authentication.
  5. Thêm cờ -ObjC vào phần Other Linker Flags (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 xuống ở chế độ nền.

Tiếp theo, hãy thực hiện một số bước định cấu hình:

  1. Nếu bạn chưa kết nối ứng dụng với dự án Firebase, hãy thực hiện việc này từ bảng điều khiển Firebase.
  2. Bật tính năng đăng nhập bằng email/mật khẩu:
    1. Trong Firebase bảng điều khiển, hãy mở phần Auth (Xác thực).
    2. Trên thẻ Sign in method (Phương thức đăng nhập), hãy bật phương thức đăng nhập Email/password (Email/mật khẩu) rồi nhấp vào Save (Lưu).

Tạo tài khoản dựa trên mật khẩu

Để tạo tài khoản người dùng mới bằng mật khẩu, hãy hoàn tất các bước sau trong hoạt động đăng nhập của ứng dụng:

  1. Nhập mô-đun FirebaseCore trong UIApplicationDelegate, cũng như mọi mô-đun Firebase khác mà đại diện ứng dụng của bạn sử dụng. Ví dụ: để sử dụng Cloud FirestoreAuthentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. Định cấu hình một FirebaseApp thực thể dùng chung trong phương thức application(_:didFinishLaunchingWithOptions:) của đại diện ứng dụng:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Nếu đang sử dụng SwiftUI, bạn phải tạo một đại diện ứng dụng và đính kèm đại diện đó vào cấu trúc App thông qua UIApplicationDelegateAdaptor hoặc NSApplicationDelegateAdaptor. Bạn cũng phải tắt tính năng hoán đổi đại diện ứng dụng. Để biết thêm thông tin, hãy xem hướng dẫn về SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. Khi người dùng mới đăng ký bằng biểu mẫu đăng ký của ứng dụng, hãy hoàn tất mọi bước xác thực tài khoản mới mà ứng dụng của bạn yêu cầu, chẳng hạn như xác minh rằng mật khẩu của tài khoản mới đã được nhập đúng và đáp ứng các yêu cầu về độ phức tạp.
  5. Tạo tài khoản mới bằng cách truyền địa chỉ email và mật khẩu của người dùng mới đến createUser.

    Swift

    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] createUserWithEmail:email
                               password:password
                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                          NSError * _Nullable error) {
      // ...
    }];
    Nếu tài khoản mới được tạo thành công, người dùng sẽ đăng nhập và bạn có thể lấy dữ liệu tài khoản của người dùng từ đối tượng kết quả được truyền đến phương thức gọi lại.

Đăng nhập cho người dùng bằng địa chỉ email và mật khẩu

Các bước đăng nhập cho người dùng bằng mật khẩu tương tự như các bước tạo tài khoản mới. Trong hoạt động đăng nhập của ứng dụng, hãy làm như sau:

  1. Nhập mô-đun FirebaseCore trong UIApplicationDelegate, cũng như mọi mô-đun Firebase khác mà đại diện ứng dụng của bạn sử dụng. Ví dụ: để sử dụng Cloud FirestoreAuthentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. Định cấu hình một FirebaseApp thực thể dùng chung trong phương thức application(_:didFinishLaunchingWithOptions:) của đại diện ứng dụng:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Nếu đang sử dụng SwiftUI, bạn phải tạo một đại diện ứng dụng và đính kèm đại diện đó vào cấu trúc App thông qua UIApplicationDelegateAdaptor hoặc NSApplicationDelegateAdaptor. Bạn cũng phải tắt tính năng hoán đổi đại diện ứng dụng. Để biết thêm thông tin, hãy xem hướng dẫn về SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. Khi người dùng đăng nhập vào ứng dụng của bạn, hãy truyền địa chỉ email và mật khẩu của người dùng đến signIn.

    Swift

    Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
      guard let strongSelf = self else { return }
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithEmail:self->_emailField.text
                           password:self->_passwordField.text
                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
      // ...
    }];
    Nếu người dùng đăng nhập thành công, bạn có thể lấy dữ liệu tài khoản của người dùng từ đối tượng kết quả được truyền đến phương thức gọi lại.

Đề xuất: Đặt chính sách mật khẩu

Bạn có thể cải thiện tính bảo mật của tài khoản bằng cách thực thi các yêu cầu về độ phức tạp của mật khẩu.

Để định cấu hình chính sách mật khẩu cho dự án, hãy mở thẻ Password policy (Chính sách mật khẩu) trên trang Authentication Settings (Cài đặt xác thực) của bảng điều khiển Firebase:

Authentication Settings (Cài đặt xác thực)

Firebase Authentication chính sách mật khẩu hỗ trợ các yêu cầu sau về mật khẩu:

  • Cần có ký tự viết thường

  • Cần có ký tự viết hoa

  • Cần có ký tự số

  • Cần có ký tự không phải chữ và số

    Các ký tự sau đây đáp ứng yêu cầu về ký tự không phải chữ và số: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • Độ dài tối thiểu của mật khẩu (từ 6 đến 30 ký tự; mặc định là 6)

  • Độ dài tối đa của mật khẩu (tối đa là 4096 ký tự)

Bạn có thể bật tính năng thực thi chính sách mật khẩu ở hai chế độ:

  • Yêu cầu: Các lần thử đăng ký sẽ không thành công cho đến khi người dùng cập nhật mật khẩu tuân thủ chính sách của bạn.

  • Notify (Thông báo): Người dùng được phép đăng ký bằng mật khẩu không tuân thủ. Khi sử dụng chế độ này, bạn nên kiểm tra xem mật khẩu của người dùng có tuân thủ chính sách ở phía máy khách hay không và nhắc người dùng theo cách nào đó để cập nhật mật khẩu nếu mật khẩu đó không tuân thủ.

Người dùng mới luôn phải chọn mật khẩu tuân thủ chính sách của bạn.

Nếu có người dùng đang hoạt động, bạn không nên bật tính năng buộc nâng cấp khi đăng nhập, trừ phi bạn dự định chặn quyền truy cập đối với những người dùng có mật khẩu không tuân thủ chính sách của bạn. Thay vào đó, hãy sử dụng chế độ thông báo. Chế độ này cho phép người dùng đăng nhập bằng mật khẩu hiện tại và thông báo cho họ về những yêu cầu mà mật khẩu của họ còn thiếu.

Đề xuất: Bật tính năng bảo vệ chống liệt kê email

Một số Firebase Authentication phương thức lấy địa chỉ email làm tham số sẽ đưa ra các lỗi cụ thể nếu địa chỉ email chưa được đăng ký khi phải đăng ký (ví dụ: khi đăng nhập bằng địa chỉ email và mật khẩu) hoặc đã đăng ký khi phải chưa sử dụng (ví dụ: khi thay đổi địa chỉ email của người dùng). Mặc dù điều này có thể hữu ích cho việc đề xuất các biện pháp khắc phục cụ thể cho người dùng, nhưng các tác nhân độc hại cũng có thể lạm dụng để khám phá địa chỉ email do người dùng của bạn đăng ký.

Để giảm thiểu rủi ro này, bạn nên bật tính năng bảo vệ chống liệt kê email cho dự án của mình bằng công cụ gcloud của Google Cloud. Xin lưu ý rằng việc bật tính năng này sẽ thay đổi hành vi báo cáo lỗi của Firebase Authentication's: hãy đảm bảo rằng ứng dụng của bạn không dựa vào các lỗi cụ thể hơn.

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 xác thực, tức 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 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 của dự án Firebase và có thể dùng để xác định người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập bằng cách nào.

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

  • Trong Firebase Realtime DatabaseCloud Storage Quy tắc bảo mật, bạn có thể lấy mã người dùng duy nhất của người dùng đã đăng nhập từ biến auth, và sử dụng mã này để 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 dịch vụ xác thực bằng cách liên kết thông tin xác thực của nhà cung cấp dịch vụ xác thực với tài khoản người dùng hiện có.

Để đăng xuất cho 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 có thể muốn thêm mã xử lý lỗi cho toàn bộ phạm vi lỗi xác thực. Xem bài viết Xử lý lỗi.