Аутентификация с использованием Yahoo и C++

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

Прежде чем начать

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

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

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

Получите доступ к классу firebase::auth::Auth

Класс Auth является шлюзом для всех вызовов API.
  1. Добавьте заголовочные файлы Auth и App:
    #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 . Обратите внимание, что вы не можете передавать параметры, необходимые для Firebase, с помощью custom_parameters() . К таким параметрам относятся client_id , redirect_uri , response_type , scope и state .

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

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