ربط موفري المصادقة المتعددين بحساب باستخدام C++

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود. يمكن التعرف على المستخدمين من خلال معرف مستخدم Firebase نفسه بغض النظر عن موفر المصادقة الذي استخدموه لتسجيل الدخول. على سبيل المثال، يمكن للمستخدم الذي سجل الدخول باستخدام كلمة مرور ربط حساب Google وتسجيل الدخول بأي من الطريقتين في المستقبل. أو يمكن لمستخدم مجهول ربط حساب Facebook ثم تسجيل الدخول لاحقًا باستخدام Facebook لمواصلة استخدام تطبيقك.

قبل ان تبدأ

أضف دعمًا لاثنين أو أكثر من موفري المصادقة (ربما بما في ذلك المصادقة المجهولة) إلى تطبيقك.

لربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود:

  1. قم بتسجيل دخول المستخدم باستخدام أي مزود أو طريقة مصادقة.
  2. أكمل تدفق تسجيل الدخول لموفر المصادقة الجديد حتى، على سبيل المثال لا الحصر، استدعاء إحدى طرق firebase::auth::Auth::SignInWithCredential . على سبيل المثال، احصل على رمز معرف Google المميز للمستخدم، أو رمز الوصول إلى Facebook، أو البريد الإلكتروني وكلمة المرور.
  3. احصل على firebase::auth::Credential لموفر المصادقة الجديد:

    تسجيل الدخول إلى Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    
    تسجيل الدخول إلى Facebook
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    
    تسجيل الدخول بكلمة مرور البريد الإلكتروني
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
    
  4. قم بتمرير كائن firebase::auth::Credential إلى طريقة 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);
    

    سوف يفشل استدعاء LinkWithCredential إذا كانت بيانات الاعتماد مرتبطة بالفعل بحساب مستخدم آخر. في هذه الحالة، يجب عليك التعامل مع دمج الحسابات والبيانات المرتبطة بها بما يتناسب مع تطبيقك:

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

إذا نجح استدعاء LinkWithCredential ، فيمكن للمستخدم الآن تسجيل الدخول باستخدام أي موفر مصادقة مرتبط والوصول إلى نفس بيانات Firebase.

يمكنك إلغاء ربط موفر المصادقة من الحساب، بحيث لا يتمكن المستخدم بعد ذلك من تسجيل الدخول باستخدام هذا الموفر.

لإلغاء ربط موفر المصادقة من حساب مستخدم، قم بتمرير معرف الموفر إلى طريقة Unlink . يمكنك الحصول على معرفات الموفر لموفري المصادقة المرتبطين بمستخدم عن طريق الاتصال بـ 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);