C++ kullanarak bir hesaba birden çok kimlik doğrulama sağlayıcı bağlama

Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların birden fazla kimlik doğrulama sağlayıcıyı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz. Kullanıcılar, oturum açmak için kullandıkları kimlik doğrulama sağlayıcıdan bağımsız olarak aynı Firebase kullanıcı kimliğiyle tanımlanabilir. Örneğin, şifreyle oturum açan bir kullanıcı Google Hesabı bağlayabilir ve gelecekte her iki yöntemle de oturum açabilir. Alternatif olarak, anonim bir kullanıcı Facebook hesabı bağlayabilir ve daha sonra uygulamanızı kullanmaya devam etmek için Facebook ile oturum açabilir.

Başlamadan önce

Uygulamanıza iki veya daha fazla kimlik doğrulama sağlayıcısı için destek ekleyin (anonim kimlik doğrulama da dahil olabilir).

Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlamak için:

  1. Herhangi bir kimlik doğrulama sağlayıcısı veya yöntemi kullanarak kullanıcının oturumunu açın.
  2. Yeni kimlik doğrulama sağlayıcısı için oturum açma akışını, firebase::auth::Auth::SignInWithCredential yöntemlerinden birini çağırma işlemi hariç olmak üzere tamamlayın. Örneğin, kullanıcının Google kimlik jetonunu, Facebook erişim jetonunu veya e-posta adresini ve şifresini alabilirsiniz.
  3. Yeni kimlik doğrulama sağlayıcı için firebase::auth::Credential alın:

    Google ile oturum açma
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    Facebook ile Giriş
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    E-posta ve şifreyle oturum açma
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
  4. firebase::auth::Credential nesnesini, oturum açmış kullanıcının LinkWithCredential yöntemine iletin:

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

    Kimlik bilgileri başka bir kullanıcı hesabına zaten bağlıysa LinkWithCredential ile yapılan görüşme başarısız olur. Bu durumda, hesapları ve ilişkili verileri uygulamanıza uygun şekilde birleştirmeniz gerekir:

    // 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 çağrısı başarılı olursa kullanıcı artık bağlı kimlik doğrulama sağlayıcılarından herhangi birini kullanarak oturum açabilir ve aynı Firebase verilerine erişebilir.

Kullanıcının artık bu sağlayıcıyla oturum açamaması için bir kimlik doğrulama sağlayıcısının bağlantısını hesaptan kaldırabilirsiniz.

Bir kimlik doğrulama sağlayıcısının bağlantısını kullanıcı hesabından kaldırmak için sağlayıcı kimliğini Unlink yöntemine iletin. Bir kullanıcıya bağlı kimlik doğrulama sağlayıcılarının sağlayıcı kimliklerini ProviderData numaralı telefonu arayarak alabilirsiniz.

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

Sorun giderme

Birden fazla hesabı bağlamaya çalışırken hatalarla karşılaşırsanız doğrulanmış e-posta adresleriyle ilgili dokümanlara göz atın.