Аутентификация с помощью Yahoo и C++

Вы можете разрешить пользователям проходить аутентификацию в Firebase с помощью поставщиков OAuth, таких как Yahoo. Для этого интегрируйте в приложение универсальный вход через OAuth на основе веб-технологий, используя Firebase SDK для выполнения всего процесса входа. Поскольку для этого процесса требуется использовать Firebase SDK для телефонов, он поддерживается только на платформах Android и Apple.

Подготовка

  1. Добавьте Firebase в свой проект C++.
  2. В консоли Firebase выберите Безопасность > Аутентификация.
  3. На вкладке Способ входа включите поставщика для входа через Yahoo.
  4. Добавьте идентификатор клиента и секретный код клиента из консоли разработчика поставщика в конфигурацию поставщика:
    1. Чтобы зарегистрировать клиент OAuth Yahoo, следуйте инструкциям в документации для разработчиков Yahoo о том, как зарегистрировать веб-приложение в Yahoo.

      Выберите два разрешения OpenID Connect API: profile и email.

    2. При регистрации приложений у этих поставщиков обязательно укажите домен *.firebaseapp.com для своего проекта в качестве домена переадресации для приложения.
  5. Нажмите Сохранить.

Как получить доступ к курсу firebase::auth::Auth

Класс Auth – это шлюз для всех вызовов API.
  1. Добавьте файлы заголовков Auth и App:
    #include <cassert>
    #include <cstdint>
    
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. В коде инициализации создайте класс firebase::App.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. Получите класс firebase::auth::Auth для вашего firebase::App. Между App и Auth существует однозначное соответствие.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);

Как обрабатывать процесс входа с помощью Firebase SDK

Чтобы реализовать процесс входа с помощью Firebase SDK, выполните следующие действия:

  1. Создайте экземпляр FederatedOAuthProviderData, настроенный с идентификатором поставщика, подходящим для Yahoo.

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::YahooAuthProvider::kProviderId);
    
  2. Необязательно. Укажите дополнительные специальные параметры OAuth, которые вы хотите отправить с запросом OAuth.

    // Prompt user to re-authenticate to Yahoo.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    

    Информацию о параметрах, поддерживаемых Yahoo, можно найти в документации по Yahoo OAuth. Обратите внимание, что с помощью custom_parameters() нельзя передавать параметры, обязательные для Firebase. Это параметры client_id, redirect_uri, response_type, scope и state.

  3. Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо profile и email, которые вы хотите запросить у поставщика услуг аутентификации. Если вашему приложению требуется доступ к закрытым пользовательским данным из Yahoo API, вам нужно запросить разрешения для Yahoo API в разделе API Permissions консоли разработчика Yahoo. Запрашиваемые области действия OAuth должны точно соответствовать предварительно настроенным областям в разрешениях API приложения. Например, если приложению требуется доступ на чтение и запись к контактам пользователя и это разрешение предварительно настроено в API приложения, то вместо области действия OAuth sdct-r (только чтение) необходимо передать значение sdct-w. В противном случае процесс будет прерван и конечному пользователю будет показано сообщение об ошибке.

    // Request access to Yahoo Mail API.
    provider_data.scopes.push_back("mail-r");
    // This must be preconfigured in the app's API permissions.
    provider_data.scopes.push_back("sdct-w");
    

    Подробнее о запросах Yahoo…

  4. После того как вы настроите данные поставщика, используйте их, чтобы создать FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. Выполните аутентификацию в Firebase с помощью объекта поставщика аутентификации. Обратите внимание, что в отличие от других операций FirebaseAuth эта операция перехватывает управление интерфейсом, показывая веб-представление, в котором пользователь может ввести свои учетные данные.

    Чтобы начать процесс входа, вызовите SignInWithProvider:

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    Затем приложение может подождать или зарегистрировать обратный вызов в Future.

  6. В приведенных выше примерах рассматриваются процессы входа в аккаунт, но вы также можете связать поставщика Yahoo с существующим пользователем, используя LinkWithProvider. Например, вы можете связать несколько поставщиков с одним пользователем, чтобы он мог входить в систему с помощью любого из них.

    firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
    
  7. Аналогичный шаблон можно использовать с функцией ReauthenticateWithProvider, которая позволяет получать новые учетные данные для выполнения конфиденциальных операций, требующих недавнего входа в систему.

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    Затем приложение может подождать или зарегистрировать обратный вызов в объекте Future.

Дальнейшие действия

После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.

  • В своих приложениях вы можете получить основную информацию профиля пользователя из объекта firebase::auth::User:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
  • В Firebase Realtime Database и Cloud Storage правилах безопасности можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной auth и использовать его, чтобы контролировать, к каким данным у пользователя есть доступ.

Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков услуг аутентификации, связав учетные данные поставщика услуг аутентификации с существующим аккаунтом пользователя.

Чтобы выйти из аккаунта пользователя, вызовите функцию SignOut():

auth->SignOut();