Вы можете разрешить пользователям проходить аутентификацию в Firebase с помощью поставщиков OAuth, таких как Microsoft Azure Active Directory. Для этого интегрируйте в приложение общий веб-интерфейс входа через OAuth, используя Firebase SDK для выполнения всего процесса входа. Поскольку для этого процесса требуется использовать Firebase SDK для телефонов, он поддерживается только на платформах Android и Apple.
Подготовка
- Добавьте Firebase в свой проект C++.
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Способ входа включите поставщика для входа через Microsoft.
-
Добавьте идентификатор клиента и секретный код клиента из консоли разработчика поставщика в конфигурацию поставщика:
- Чтобы зарегистрировать клиент OAuth Microsoft, следуйте инструкциям в руководстве по регистрации приложения с конечной точкой Azure Active Directory версии 2.0. Обратите внимание, что эта конечная точка поддерживает вход с использованием личных аккаунтов Microsoft, а также аккаунтов Azure Active Directory. Подробнее о Azure Active Directory версии 2.0…
-
При регистрации приложений у этих поставщиков обязательно укажите домен
*.firebaseapp.comдля своего проекта в качестве домена переадресации для приложения.
- Нажмите Сохранить.
Как получить доступ к курсу firebase::auth::Auth
Класс Auth – это шлюз для всех вызовов API.
- Добавьте файлы заголовков Auth и App:
#include <cassert> #include <cstdint> #include "firebase/app.h" #include "firebase/auth.h"
- В коде инициализации создайте класс
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__)
- Получите класс
firebase::auth::Authдля вашегоfirebase::App. МеждуAppиAuthсуществует однозначное соответствие.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Как обрабатывать процесс входа с помощью Firebase SDK
Чтобы реализовать процесс входа с помощью Firebase SDK, выполните следующие действия:
Создайте экземпляр
FederatedOAuthProviderData, настроенный с идентификатором поставщика, подходящим для Microsoft.firebase::auth::FederatedOAuthProviderData provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);Необязательно. Укажите дополнительные специальные параметры 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. Обратите внимание, что с помощью
setCustomParameters()нельзя передавать параметры, обязательные для Firebase. Это параметры client_id, response_type, redirect_uri, state, scope и response_mode.Чтобы разрешить вход в приложение только пользователям определенного клиента Azure AD, можно использовать понятное доменное имя клиента Azure AD или его глобальный уникальный идентификатор. Для этого укажите поле tenant в объекте специальных параметров.
// 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";Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо базового профиля, которые вы хотите запросить у поставщика услуг аутентификации.
provider_data.scopes.push_back("mail.read"); provider_data.scopes.push_back("calendars.read");Подробнее о разрешениях и согласии Microsoft…
После того как вы настроите данные поставщика, используйте их, чтобы создать
FederatedOAuthProvider.// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);Выполните аутентификацию в Firebase с помощью объекта поставщика аутентификации. Обратите внимание, что в отличие от других операций FirebaseAuth эта операция перехватывает управление интерфейсом, показывая веб-представление, в котором пользователь может ввести свои учетные данные.
Чтобы начать процесс входа, вызовите
SignInWithProvider:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);Затем приложение может подождать или зарегистрировать обратный вызов в Future.
С помощью токена доступа OAuth можно вызвать Microsoft Graph API.
В отличие от других поставщиков, поддерживаемых Firebase Auth, Microsoft не предоставляет URL фотографии. Вместо этого двоичные данные для фотографии профиля необходимо запросить через Microsoft Graph API.
В приведенных выше примерах основное внимание уделяется процессам входа в систему, но вы также можете связать поставщика Microsoft Azure Active Directory с существующим пользователем с помощью
LinkWithProvider. Например, вы можете связать несколько поставщиков с одним пользователем, чтобы он мог входить в систему с помощью любого из них.firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);Аналогичный шаблон можно использовать с функцией
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();