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++
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ể 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.
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 tài khoản người dù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 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.
Hoàn tất quy trình đăng nhập cho trình 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 firebase::auth::Auth::SignInWithCredential. 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.
Lấy firebase::auth::Credential cho trình xác thực mới:
Truyền đối tượng firebase::auth::Credential đến phương thức LinkWithCredential của người dùng đã đăng nhập:
// Link the new credential to the currently active user.firebase::auth::Usercurrent_user=auth->current_user();firebase::Future<firebase::auth::AuthResult>result=current_user.LinkWithCredential(credential);
Lệnh gọi đến LinkWithCredential sẽ không thành công nếu thông tin đăng nhập đã được liên kết với một tài khoản người dùng khác. Trong trường hợp này, bạn phải xử lý việc hợp nhất các tài khoản và dữ liệu liên kết cho phù hợp với ứng dụng của mình:
// Gather data for the currently signed in User.firebase::auth::Usercurrent_user=auth->current_user();std::stringcurrent_email=current_user.email();std::stringcurrent_provider_id=current_user.provider_id();std::stringcurrent_display_name=current_user.display_name();std::stringcurrent_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ỳ 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.
Huỷ liên kết nhà cung cấp dịch vụ uỷ quyền khỏi tài khoản người dùng
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ụ 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::Usercurrent_user=auth->current_user();firebase::Future<firebase::auth::AuthResult>result=current_user.Unlink(providerId);
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-08-28 UTC."],[],[],null,["| **Important** : There is a [known issue](https://github.com/firebase/firebase-js-sdk/issues/7675) that prevents `linkWithCredentials()` from working correctly in some projects. See the issue report for a workaround and the status of a fix.\n\nYou can allow users to sign in to your app using multiple authentication\nproviders by linking auth provider credentials to an existing user account.\nUsers are identifiable by the same Firebase user ID regardless of the\nauthentication provider they used to sign in. For example, a user who signed in\nwith a password can link a Google account and sign in with either method in the\nfuture. Or, an anonymous user can link a Facebook account and then, later, sign\nin with Facebook to continue using your app.\n\nBefore you begin\n\nAdd support for two or more authentication providers (possibly including\nanonymous authentication) to your app.\n\nLink auth provider credentials to a user account\n\nTo link auth provider credentials to an existing user account:\n\n1. Sign in the user using any authentication provider or method.\n2. Complete the sign-in flow for the new authentication provider up to, but not including, calling one of the [`firebase::auth::Auth::SignInWithCredential`](/docs/reference/cpp/class/firebase/auth/auth#signinwithcredential) methods. For example, get the user's Google ID token, Facebook access token, or email and password.\n3. Get a `firebase::auth::Credential` for the new authentication provider:\n\n **Google Sign-In** \n\n ```c++\n firebase::auth::Credential credential =\n firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,\n nullptr);\n ```\n **Facebook Login** \n\n ```c++\n firebase::auth::Credential credential =\n firebase::auth::FacebookAuthProvider::GetCredential(access_token);\n ```\n **Email-password sign-in** \n\n ```c++\n firebase::auth::Credential credential =\n firebase::auth::EmailAuthProvider::GetCredential(email, password);\n ```\n4. Pass the `firebase::auth::Credential` object to the signed-in user's\n `LinkWithCredential` method:\n\n ```c++\n // Link the new credential to the currently active user.\n firebase::auth::User current_user = auth-\u003ecurrent_user();\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n current_user.LinkWithCredential(credential);\n ```\n\n The call to `LinkWithCredential` will fail if the credentials are\n already linked to another user account. In this situation, you must handle\n merging the accounts and associated data as appropriate for your app: \n\n ```c++\n // Gather data for the currently signed in User.\n firebase::auth::User current_user = auth-\u003ecurrent_user();\n std::string current_email = current_user.email();\n std::string current_provider_id = current_user.provider_id();\n std::string current_display_name = current_user.display_name();\n std::string current_photo_url = current_user.photo_url();\n\n // Sign in with the new credentials.\n firebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n auth-\u003eSignInAndRetrieveDataWithCredential(credential);\n\n // To keep example simple, wait on the current thread until call completes.\n while (result.status() == firebase::kFutureStatusPending) {\n Wait(100);\n }\n\n // The new User is now active.\n if (result.error() == firebase::auth::kAuthErrorNone) {\n firebase::auth::User* new_user = *result.result();\n\n // Merge new_user with the user in details.\n // ...\n (void)new_user;\n }\n ```\n\nIf the call to `LinkWithCredential` succeeds, the user can now sign in using\nany linked authentication provider and access the same Firebase data.\n\nUnlink an auth provider from a user account\n\nYou can unlink an auth provider from an account, so that the user can no\nlonger sign in with that provider.\n\nTo unlink an auth provider from a user account, pass the provider ID to the\n`Unlink` method. You can get the provider IDs of the auth providers\nlinked to a user by calling [`ProviderData`](/docs/reference/cpp/class/firebase/auth/user#providerdata). \n\n```c++\n// Unlink the sign-in provider from the currently active user.\nfirebase::auth::User current_user = auth-\u003ecurrent_user();\nfirebase::Future\u003cfirebase::auth::AuthResult\u003e result =\n current_user.Unlink(providerId);\n```\n\nTroubleshooting\n\nIf you encounter errors when trying to link multiple accounts, see the\n[documentation on\nverified email addresses](https://firebase.google.com/docs/auth/users#verified_email_addresses)."]]