Liên kết nhiều nhà cung cấp dịch vụ xác thực với một tài khoản

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 trì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 trì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ười dùng có thể nhận dạng bằng cùng một mã nhận dạng người dùng Firebase, bất kể nhà cung cấp dịch vụ xác thực mà họ dùng để đăng nhập. Ví dụ: người dùng đã đăng nhập bằng mật khẩu có thể liên kết một Tài khoản Google và đăng nhập bằng một trong hai phương thức này trong tương lai. Hoặc người dùng ẩn danh có thể liên kết tài khoản Facebook rồi sau đó đăng nhập bằng Facebook để tiếp tục sử dụng ứng dụng của bạn.

Trước khi bắt đầu

Thêm tính năng hỗ trợ cho 2 hoặc nhiều nhà cung cấp dịch vụ xác thực (có thể bao gồm cả xác thực ẩn danh) vào ứng dụng của bạn.

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

  1. Đăng nhập cho người dùng bằng bất kỳ trình cung cấp hoặc phương thức xác thực nào.

  2. Hoàn tất quy trình đăng nhập cho trình cung cấp dịch vụ xác thực mới, nhưng không bao gồm việc gọi một trong các phương thức signInWith. Ví dụ: lấy mã thông báo nhận dạng trên Google, mã thông báo truy cập Facebook hoặc email và mật khẩu của người dùng.

  3. Nhận một đối tượng Credential cho trình cung cấp dịch vụ xác thực mới:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. Truyền đối tượng Credential vào phương thức linkWithCredential() của người dùng đăng nhập:

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

Nếu lệnh gọi đến linkWithCredential() thành công, thì giờ đây, người dùng có thể đăng nhập bằng bất kỳ trình cung cấp dịch vụ xác thực được liên kết nào và truy cập vào cùng một dữ liệu Firebase.

Bạn có thể huỷ liên kết một nhà cung cấp dịch vụ uỷ quyền khỏi một tài khoản để người dùng không thể đăng nhập bằng nhà cung cấp đó nữa.

Để huỷ liên kết một nhà cung cấp dịch vụ uỷ quyền khỏi tài khoản người dùng, hãy truyền mã nhận dạng nhà cung cấp đến phương thức unlink(). Bạn có thể lấy mã nhận dạng nhà cung cấp của các nhà cung cấp dịch vụ uỷ quyền được liên kết với một người dùng từ thuộc tính providerData của đối tượng User.

try {
  await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "no-such-provider":
      print("The user isn't linked to the provider or the provider "
          "doesn't exist.");
      break;
    default:
      print("Unknown error.");
  }
}

Khắc phục sự cố

Nếu bạn gặp lỗi khi cố gắng liên kết nhiều tài khoản, hãy xem tài liệu về địa chỉ email đã xác minh.