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

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

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

  1. Добавьте Firebase в свой проект C++ .
  2. В консоли Firebase откройте раздел Auth .
  3. На вкладке «Метод входа» включите поставщика Microsoft .
  4. Добавьте идентификатор клиента и секрет клиента из консоли разработчика этого поставщика в конфигурацию поставщика:
    1. Чтобы зарегистрировать клиент Microsoft OAuth, следуйте инструкциям в разделе Краткое руководство: Зарегистрируйте приложение с помощью конечной точки Azure Active Directory v2.0 . Обратите внимание, что эта конечная точка поддерживает вход с использованием личных учетных записей Microsoft, а также учетных записей Azure Active Directory. Узнайте больше об Azure Active Directory версии 2.0.
    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 , настроенный с идентификатором поставщика, подходящим для Microsoft.

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

    // Prompt user to re-authenticate to Microsoft.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Target specific email with login hint.
    provider_data.custom_parameters["login_hint"] =
        "user@firstadd.onmicrosoft.com";
    

    Параметры, поддерживаемые Microsoft, см. в документации Microsoft OAuth . Обратите внимание, что вы не можете передавать параметры, необходимые для Firebase, с помощью setCustomParameters() . Этими параметрами являются client_id , тип_ответа , redirect_uri , состояние , область действия и режим_ответа .

    Чтобы разрешить вход в приложение только пользователям из определенного клиента Azure AD, можно использовать либо понятное доменное имя клиента Azure AD, либо идентификатор GUID клиента. Это можно сделать, указав поле «арендатор» в объекте пользовательских параметров.

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider_data.custom_parameters["tenant"] ="TENANT_ID";
    
  3. Необязательно : укажите дополнительные области OAuth 2.0 помимо базового профиля, которые вы хотите запросить у поставщика аутентификации.

    provider_data.scopes.push_back("mail.read");
    provider_data.scopes.push_back("calendars.read");
    

    Дополнительные сведения см. в документации по разрешениям и согласиям Microsoft .

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

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

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

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

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

    Используя токен доступа OAuth, вы можете вызвать API Microsoft Graph .

    В отличие от других поставщиков, поддерживаемых Firebase Auth, Microsoft не предоставляет URL-адрес фотографии, и вместо этого двоичные данные для фотографии профиля необходимо запрашивать через Microsoft Graph API .

  6. Хотя приведенные выше примеры посвящены потокам входа, у вас также есть возможность связать поставщика Microsoft Azure Active Directory с существующим пользователем с помощью 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

Чтобы выйти из системы, вызовите SignOut() :

auth->SignOut();