Вы можете позволить своим пользователям аутентифицироваться в Firebase с помощью поставщиков OAuth, таких как Microsoft Azure Active Directory, интегрировав универсальный веб-вход OAuth в свое приложение с помощью Firebase SDK для выполнения сквозного процесса входа.
Прежде чем вы начнете
Для входа пользователей с использованием учетных записей Microsoft (Azure Active Directory и личных учетных записей Microsoft) необходимо сначала включить Microsoft в качестве поставщика входа для вашего проекта Firebase:
- В консоли Firebase откройте раздел Auth .
- На вкладке Способ входа включите поставщика Microsoft .
- Добавьте идентификатор клиента и секрет клиента из консоли разработчика этого провайдера в конфигурацию провайдера:
- Чтобы зарегистрировать клиент Microsoft OAuth, следуйте инструкциям в разделе Краткое руководство. Зарегистрируйте приложение с помощью конечной точки Azure Active Directory версии 2.0 . Обратите внимание, что эта конечная точка поддерживает вход с использованием личных учетных записей Microsoft, а также учетных записей Azure Active Directory. Узнайте больше об Azure Active Directory версии 2.0.
- При регистрации приложений у этих поставщиков обязательно зарегистрируйте домен
*.firebaseapp.com
для своего проекта в качестве домена перенаправления для вашего приложения.
- Нажмите Сохранить .
Если вы еще не указали отпечаток пальца SHA-1 своего приложения, сделайте это на странице настроек консоли Firebase. Подробнее о том, как получить отпечаток пальца SHA-1 вашего приложения, см. в разделе Аутентификация вашего клиента .
Обработка процесса входа с помощью Firebase SDK
Если вы создаете приложение для Android, самый простой способ аутентификации пользователей в Firebase с использованием их учетных записей Microsoft — это обработка всего процесса входа с помощью Firebase Android SDK.
Чтобы обработать процесс входа с помощью Firebase Android SDK, выполните следующие действия:
Создайте экземпляр OAuthProvider с помощью его Builder с идентификатором поставщика microsoft.com .
Kotlin+KTX
val provider = OAuthProvider.newBuilder("microsoft.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
Необязательно : укажите дополнительные настраиваемые параметры OAuth, которые вы хотите отправить с запросом OAuth.
Kotlin+KTX
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent") // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com")
Java
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent"); // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
Информацию о поддерживаемых Microsoft параметрах см. в документации Microsoft OAuth . Обратите внимание, что вы не можете передавать параметры, необходимые для Firebase, с помощью
setCustomParameters()
. Это параметры client_id , response_type , redirect_uri , state , scope и response_mode .Чтобы разрешить вход в приложение только пользователям из определенного арендатора Azure AD, можно использовать понятное доменное имя арендатора Azure AD или идентификатор GUID арендатора. Это можно сделать, указав поле «арендатор» в объекте пользовательских параметров.
Kotlin+KTX
// 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.addCustomParameter("tenant", "TENANT_ID")
Java
// 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.addCustomParameter("tenant", "TENANT_ID");
Необязательно : укажите дополнительные области действия OAuth 2.0 помимо базового профиля, которые вы хотите запросить у поставщика проверки подлинности.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; provider.setScopes(scopes);
Дополнительные сведения см. в документации по разрешениям и согласию Microsoft .
Выполните аутентификацию в Firebase, используя объект поставщика OAuth. Обратите внимание, что в отличие от других операций FirebaseAuth, эта операция возьмет на себя управление вашим пользовательским интерфейсом, открыв настраиваемую вкладку Chrome . В результате не ссылайтесь на свою активность в
OnSuccessListener
иOnFailureListener
, которые вы присоединяете, так как они сразу же отсоединяются, когда операция запускает пользовательский интерфейс.Вы должны сначала проверить, если вы уже получили ответ. Вход с помощью этого метода переводит вашу активность в фоновый режим, что означает, что она может быть восстановлена системой во время процесса входа. Чтобы убедиться, что вы не заставите пользователя повторить попытку, если это произойдет, вы должны проверить, присутствует ли уже результат.
Чтобы проверить, есть ли ожидающий результат, вызовите
getPendingAuthResult
:Kotlin+KTX
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Чтобы запустить процесс входа, вызовите
startActivityForSignInWithProvider
:Kotlin+KTX
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
После успешного завершения маркер доступа OAuth, связанный с поставщиком, может быть получен из возвращаемого объекта
OAuthCredential
.Используя токен доступа OAuth, вы можете вызывать API Microsoft Graph .
В отличие от других поставщиков, поддерживаемых Firebase Auth, Microsoft не предоставляет URL-адрес фотографии, и вместо этого двоичные данные для фотографии профиля необходимо запрашивать через Microsoft Graph API .
В дополнение к токену доступа OAuth, токен идентификатора OAuth пользователя также можно получить из объекта
OAuthCredential
.sub
утверждение в токене идентификатора зависит от приложения и не будет соответствовать идентификатору федеративного пользователя, используемому Firebase Auth и доступному черезuser.getProviderData().get(0).getUid()
. Вместо этого следует использовать поле утвержденияoid
. При использовании клиента Azure AD для входа утверждениеoid
будет точно соответствовать. Однако в случае отсутствия арендатора полеoid
дополняется. Для федеративного идентификатора4b2eabcdefghijkl
oid
иметь вид00000000-0000-0000-4b2e-abcdefghijkl
.Хотя в приведенных выше примерах основное внимание уделяется потокам входа, у вас также есть возможность связать поставщика Microsoft с существующим пользователем с помощью
startActivityForLinkWithProvider
. Например, вы можете связать нескольких провайдеров с одним и тем же пользователем, позволяя им входить в систему с помощью любого из них.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Тот же шаблон можно использовать с
startActivityForReauthenticateWithProvider
, который можно использовать для получения новых учетных данных для конфиденциальных операций, требующих недавнего входа в систему.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя и связывается с учетными данными, т. е. с именем пользователя и паролем, номером телефона или информацией о поставщике проверки подлинности, с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от того, как пользователь входит в систему.
В своих приложениях вы можете получить основную информацию о профиле пользователя из объекта
FirebaseUser
. См. Управление пользователями .В правилах безопасности базы данных Firebase Realtime и облачного хранилища вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности, связав учетные данные поставщика проверки подлинности с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();