Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Связывание нескольких поставщиков аутентификации с учетной записью с помощью C ++

Вы можете разрешить пользователям входить в ваше приложение с помощью нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя Firebase независимо от поставщика аутентификации, который они использовали для входа. Например, пользователь, который вошел в систему с паролем, может связать учетную запись Google и войти в систему любым методом в будущем. Или анонимный пользователь может связать учетную запись Facebook, а затем войти в систему с помощью Facebook, чтобы продолжить использование вашего приложения.

Прежде чем вы начнете

Добавьте в свое приложение поддержку двух или более провайдеров аутентификации (возможно, включая анонимную аутентификацию).

Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:

  1. Войдите в систему, используя любой провайдер или метод аутентификации.
  2. Заполните регистрационную в потоке для нового поставщика аутентификации до, но не включая, позвонив по одному из firebase::auth::Auth::SignInWithCredential методы. Например, получите токен Google ID пользователя, токен доступа 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);
    
    Email-пароль входа в
    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::User*> 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::User*> result =
        auth->SignInWithCredential(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 метода. Вы можете получить идентификаторы провайдера провайдеров AUTH , связанных с пользователем по телефону ProviderData .

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