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ằng C++

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 phương thức 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ười dùng có thể được nhận dạng bởi 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ọ đã sử dụng để đăng nhập. Ví dụ: một người dùng đã đăng nhập có thể liên kết Tài khoản Google và đăng nhập bằng một trong hai phương thức trong tương lai. Hoặc người dùng ẩn danh có thể liên kết tài khoản Facebook và sau đó ký đăng nhập với 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 xác thực ẩn danh) cho ứng dụng của mình.

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 người dùng bằng bất kỳ phương thức hoặc nhà cung cấp dịch vụ xác thực nào.
  2. Hoàn tất quy trình đăng nhập cho nhà cung cấp dịch vụ xác thực mới tối đa nhưng không bao gồm cả việc gọi một trong các phương thức firebase::auth::Auth::SignInWithCredential. Ví dụ: nhận mã thông báo ID Google, mã truy cập Facebook hoặc email và mật khẩu của người dùng.
  3. Nhận firebase::auth::Credential cho nhà cung cấp dịch vụ xác thực mới:

    Đăng nhập bằng Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    
    Đăng nhập vào Facebook
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    
    Đăng nhập bằng mật khẩu email
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
    
  4. Truyền đối tượng firebase::auth::Credential đến tài khoản của người dùng đã đăng nhập Phương thức LinkWithCredential:

    // Link the new credential to the currently active user.
    firebase::auth::User current_user = auth->current_user();
    firebase::Future<firebase::auth::AuthResult> result =
        current_user.LinkWithCredential(credential);
    

    Lệnh gọi đến LinkWithCredential sẽ không thực hiện được nếu thông tin đăng nhập là đã được liên kết với một tài khoản người dùng khác. Trong tình huống này, bạn phải xử lý hợp nhất các tài khoản và dữ liệu liên quan sao cho phù hợp với ứng dụng của bạn:

    // Gather data for the currently signed in User.
    firebase::auth::User current_user = auth->current_user();
    std::string current_email = current_user.email();
    std::string current_provider_id = current_user.provider_id();
    std::string current_display_name = current_user.display_name();
    std::string current_photo_url = current_user.photo_url();
    
    // Sign in with the new credentials.
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // The new User is now active.
    if (result.error() == firebase::auth::kAuthErrorNone) {
      firebase::auth::User* new_user = *result.result();
    
      // Merge new_user with the user in details.
      // ...
      (void)new_user;
    }
    

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ỳ nhà cung cấp dịch vụ xác thực nào được liên kết và truy cập vào cùng một dữ liệu Firebase.

Bạn có thể huỷ liên kết nhà cung cấp dịch vụ xác thực khỏi một tài khoản để người dùng không thể đăng nhập bằng tài khoản nhà cung cấp đó lâu hơn.

Để huỷ liên kết nhà cung cấp dịch vụ xác thực khỏi tài khoản người dùng, hãy chuyển mã nhà cung cấp vào phương thức Unlink. Bạn có thể lấy mã nhà cung cấp của các nhà cung cấp dịch vụ xác thực được liên kết với người dùng bằng cách gọi ProviderData.

// Unlink the sign-in provider from the currently active user.
firebase::auth::User current_user = auth->current_user();
firebase::Future<firebase::auth::AuthResult> result =
    current_user.Unlink(providerId);