Как легко добавить вход в приложение для Android с помощью FirebaseUI

FirebaseUI Auth – это библиотека, созданная на основе Firebase Authentication SDK. Она предоставляет готовые интерфейсы для использования в приложении.

Рекомендуемый процесс входа использует экраны создания. Если вы используете приложения, в которых по-прежнему применяются действия, ознакомьтесь с разделом Приложения на основе действий.

FirebaseUI Auth имеет следующие преимущества:

  • Несколько поставщиков – процессы входа с использованием электронной почты и пароля, телефона, аккаунтов Google, Facebook, Apple, GitHub, Microsoft, Yahoo, Twitter, анонимной аутентификации и пользовательского OAuth.
  • Управление аккаунтом – процессы для выполнения задач по управлению аккаунтом, например создания аккаунта и сброса пароля.
  • Связывание аккаунтов – позволяет безопасно связывать аккаунты пользователей с разными поставщиками идентификационной информации.
  • Переход анонимного пользователя на платную версию – пути безопасного перехода анонимных пользователей на платную версию.
  • Специальные темы. Поддержка интерфейса Material 3, который может наследовать тему вашего приложения. Кроме того, поскольку FirebaseUI имеет открытый исходный код, вы можете создать форк проекта и настроить его в соответствии со своими потребностями.
  • Менеджер учетных данных – автоматическая интеграция с Менеджером учетных данных для быстрого входа на разных устройствах.
  • Многофакторная аутентификация – поддержка SMS и TOTP для дополнительной защиты.

Подготовка

  1. Если вы ещё этого не сделали, добавьте Firebase в проект для Android.
  2. В консоли Firebase включите нужные способы входа.
  3. Добавьте FirebaseUI Auth в модуль приложения:
dependencies {
    // Check Maven Central for the latest version:
    // https://central.sonatype.com/artifact/com.firebaseui/firebase-ui-auth/versions
    implementation("com.firebaseui:firebase-ui-auth:10.0.0-beta02")

    // Required only if Facebook login support is required
    // Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94
    implementation("com.facebook.android:facebook-android-sdk:8.x")
}

Как настроить способы входа

вход с аккаунтом Google

Конфигурация входа с аккаунтом Google автоматически предоставляется файлом конфигурации google-services.json. Убедитесь, что в консоли Firebase включен вход с аккаунтом Google.

Вход через Facebook

Если вы используете вход через Facebook, добавьте идентификатор приложения Facebook в strings.xml:

<resources>
    <string name="facebook_application_id" translatable="false">YOUR_FACEBOOK_APP_ID</string>
    <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_FACEBOOK_APP_ID</string>
    <string name="facebook_client_token" translatable="false">CHANGE-ME</string>
</resources>

Инструкции по настройке приведены в документации Facebook для разработчиков.

Другие поставщики

Для поставщиков Twitter, GitHub, Microsoft, Yahoo и Apple требуется настройка в Firebase Console, но не нужны дополнительные настройки для Android. Инструкции для разных поставщиков приведены в документации по Firebase Auth.

Выберите поставщиков, которых вы хотите добавить в authUIConfiguration:

val configuration = authUIConfiguration {
    context = applicationContext
    providers {
        provider(AuthProvider.Email())
        provider(
            AuthProvider.Phone(
                defaultCountryCode = "US",
            )
        )
        provider(
            AuthProvider.Google(
                scopes = listOf("email"),
                serverClientId = null,
            )
        )
        provider(AuthProvider.Facebook())
    }
}

Вход по ссылке из письма настраивается в конфигурации поставщика услуг электронной почты:

val configuration = authUIConfiguration {
    context = applicationContext
    providers {
        provider(
            AuthProvider.Email(
                isEmailLinkSignInEnabled = true,
                emailLinkActionCodeSettings = actionCodeSettings {
                    url = "https://example.com/auth"
                    handleCodeInApp = true
                    setAndroidPackageName(
                        "com.example.app",
                        true,
                        null,
                    )
                },
            )
        )
    }
}

Полный процесс обработки глубоких ссылок описан в разделе Email Link Sign-In (Вход по ссылке из письма) файла README на GitHub.

Войти

Создайте AuthUIConfiguration, а затем покажите FirebaseAuthScreen.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val authUI = FirebaseAuthUI.getInstance()

        setContent {
            MyAppTheme {
                val configuration = authUIConfiguration {
                    context = applicationContext
                    theme = AuthUITheme.fromMaterialTheme()
                    providers {
                        provider(AuthProvider.Email())
                        provider(
                            AuthProvider.Google(
                                scopes = listOf("email"),
                                serverClientId = null,
                            )
                        )
                    }
                }

                if (authUI.isSignedIn()) {
                    HomeScreen()
                } else {
                    FirebaseAuthScreen(
                        configuration = configuration,
                        authUI = authUI,
                        onSignInSuccess = { result ->
                            // User signed in successfully
                        },
                        onSignInFailure = { exception ->
                            // Sign in failed
                        },
                        onSignInCancelled = {
                            finish()
                        },
                    )
                }
            }
        }
    }
}

Это позволяет реализовать полный процесс аутентификации, который включает:

  • Аутентификация с помощью пароля.
  • Вход с аккаунтом Google.
  • Сброс пароля.
  • Стиль Material 3.
  • Поддержка Менеджера учетных данных.
  • Обработка ошибок с помощью прямых обратных вызовов.

Выйти

В FirebaseUI Auth есть удобные методы для выхода из аккаунта и его удаления:

lifecycleScope.launch {
    FirebaseAuthUI.getInstance().signOut(applicationContext)
}
lifecycleScope.launch {
    FirebaseAuthUI.getInstance().delete(applicationContext)
}

Настройки

FirebaseUI Auth можно настроить. Самый простой способ начать работу – задать тему непосредственно в authUIConfiguration:

val configuration = authUIConfiguration {
    context = applicationContext
    providers {
        provider(AuthProvider.Email())
        provider(AuthProvider.Google(scopes = listOf("email"), serverClientId = null))
    }
    theme = AuthUITheme.Adaptive
}

Вы также сможете:

  • Используйте AuthUITheme.Default, AuthUITheme.DefaultDark или AuthUITheme.Adaptive.
  • Наследуйте тему приложения с помощью AuthUITheme.fromMaterialTheme().
  • Настройте тему по умолчанию с помощью .copy().
  • Создайте полностью настраиваемый AuthUITheme.
  • Укажите логотип, URL условий использования и URL политики конфиденциальности в authUIConfiguration.

Подробную информацию о темах и настройках, в том числе о приоритете тем, стилях кнопок поставщиков и специальных темах, можно найти в разделе Theming and Customization файла readme на GitHub.

Существующие приложения на основе действий

Если в вашем приложении по-прежнему используются объекты Activity и Activity Result API, вы можете сохранить запуск на основе Activity, используя AuthFlowController:

private val authLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult(),
) { result ->
    if (result.resultCode == RESULT_OK) {
        val user = FirebaseAuth.getInstance().currentUser
        // ...
    } else {
        // User cancelled or sign-in failed
    }
}

val configuration = authUIConfiguration {
    context = applicationContext
    providers {
        provider(AuthProvider.Email())
        provider(
            AuthProvider.Google(
                scopes = listOf("email"),
                serverClientId = null,
            )
        )
    }
}

val controller = FirebaseAuthUI.getInstance().createAuthFlow(configuration)
authLauncher.launch(controller.createIntent(this))