Catch up on highlights from Firebase at Google I/O 2023. Learn more

C++ kullanarak Birden Çok Kimlik Doğrulama Sağlayıcısını Bir Hesaba 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ısı 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ısından bağımsız olarak aynı Firebase kullanıcı kimliğiyle tanımlanabilir. Örneğin, bir şifreyle oturum açan bir kullanıcı, bir Google hesabını bağlayabilir ve gelecekte herhangi bir yöntemle oturum açabilir. Veya anonim bir kullanıcı bir Facebook hesabını bağlayabilir ve daha sonra uygulamanızı kullanmaya devam etmek için Facebook ile oturum açabilir.

Sen başlamadan önce

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

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ğırana kadar tamamlayın (bu dahil değil). Örneğin, kullanıcının Google Kimliği jetonunu, Facebook erişim jetonunu veya e-posta ve şifresini alın.
  3. Yeni kimlik doğrulama sağlayıcısı için bir firebase::auth::Credential alın:

    Google Girişi
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    
    Facebook Girişi
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    
    E-posta-şifre giriş
    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 zaten başka bir kullanıcı hesabına bağlıysa, LinkWithCredential çağrısı başarısız olur. Bu durumda, hesapları ve ilişkili verileri birleştirmeyi uygulamanız için uygun şekilde ele almalısınız:

    // 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 herhangi bir bağlı kimlik doğrulama sağlayıcısını kullanarak oturum açabilir ve aynı Firebase verilerine erişebilir.

Bir kimlik doğrulama sağlayıcısının bağlantısını bir hesaptan kaldırabilirsiniz, böylece kullanıcı artık o sağlayıcıyla oturum açamaz.

Bir kimlik doğrulama sağlayıcısının kullanıcı hesabıyla bağlantısını kaldırmak için sağlayıcı kimliğini Unlink yöntemine iletin. Bir kullanıcıya bağlı auth sağlayıcılarının sağlayıcı kimliklerini ProviderData çağırarak 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);