
FirebaseUI — это библиотека, построенная на основе Firebase Authentication SDK, которая предоставляет готовые сценарии пользовательского интерфейса для использования в вашем приложении. FirebaseUI предоставляет следующие преимущества:
- Поддержка нескольких провайдеров — варианты авторизации по электронной почте/паролю, ссылке из электронной почты, аутентификации по телефону, входу через Google, входу через Facebook, входу через Twitter и входу через GitHub.
- Управление учетными записями — процессы для выполнения задач по управлению учетными записями, таких как создание учетных записей и сброс паролей.
- Связывание учетных записей — процессы для безопасного связывания учетных записей пользователей в разных системах идентификации.
- Обновление учетных записей анонимных пользователей — алгоритмы для безопасного обновления учетных записей анонимных пользователей.
- Пользовательские темы — настройте внешний вид FirebaseUI в соответствии с вашим приложением. Кроме того, поскольку FirebaseUI является проектом с открытым исходным кодом, вы можете создать форк проекта и настроить его в точном соответствии с вашими потребностями.
- Менеджер учетных данных — автоматическая интеграция с Менеджером учетных данных для быстрой авторизации на разных устройствах.
Прежде чем начать
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект .
Добавьте зависимости FirebaseUI в файл
build.gradle(.kts)вашего приложения. Если вы хотите поддерживать вход через Facebook или Twitter, также включите SDK Facebook и Twitter:dependencies { // ... implementation("com.firebaseui:firebase-ui-auth:9.0.0") // 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") }SDK аутентификации FirebaseUI имеет транзитивные зависимости от SDK Firebase и SDK сервисов Google Play.
В консоли Firebase перейдите в раздел Безопасность > Аутентификация .
На вкладке «Способ входа» включите поддерживаемые вами поставщики услуг входа. Некоторые поставщики услуг входа требуют дополнительной информации, обычно доступной в консоли разработчика сервиса.
Если у вас включен вход через Google:
Обновите файл конфигурации Firebase.
При появлении соответствующего запроса в консоли Firebase загрузите обновленный конфигурационный файл Firebase (
google-services.json), который теперь содержит информацию о клиенте OAuth, необходимую для входа через Google.Переместите этот обновленный конфигурационный файл в свой проект Android Studio, заменив им устаревший соответствующий конфигурационный файл. (См. раздел «Добавление Firebase в ваш проект Android» .)
Укажите SHA-1-отпечаток вашего приложения, если вы еще этого не сделали.
В консоли Firebase перейдите в...
> Вкладка «Общие» . Прокрутите вниз до карточки «Ваши приложения» , выберите свое приложение для Android и добавьте отпечаток SHA-1 в поле «Отпечатки сертификатов SHA» .
Подробную информацию о том, как получить SHA-отпечаток вашего приложения, см. в разделе «Аутентификация клиента» .
Если вы поддерживаете вход через Facebook или Twitter, добавьте в файл
strings.xmlстроковые ресурсы, указывающие идентификационную информацию, необходимую каждому из этих провайдеров:<resources> <!-- Facebook application ID and custom URL scheme (app ID prefixed by 'fb'). --> <string name="facebook_application_id" translatable="false">YOUR_APP_ID</string> <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_APP_ID</string> </resources>
Войти
Создайте ActivityResultLauncher , который регистрирует функцию обратного вызова для контракта результата Activity в FirebaseUI:
Kotlin
// See: https://developer.android.com/training/basics/intents/result private val signInLauncher = registerForActivityResult( FirebaseAuthUIActivityResultContract(), ) { res -> this.onSignInResult(res) }
Java
// See: https://developer.android.com/training/basics/intents/result private final ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult( new FirebaseAuthUIActivityResultContract(), new ActivityResultCallback<FirebaseAuthUIAuthenticationResult>() { @Override public void onActivityResult(FirebaseAuthUIAuthenticationResult result) { onSignInResult(result); } } );
Чтобы запустить процесс авторизации в FirebaseUI, создайте намерение авторизации с указанием предпочитаемых вами способов входа:
Kotlin
// Choose authentication providers val providers = arrayListOf( AuthUI.IdpConfig.EmailBuilder().build(), AuthUI.IdpConfig.PhoneBuilder().build(), AuthUI.IdpConfig.GoogleBuilder().build(), AuthUI.IdpConfig.FacebookBuilder().build(), AuthUI.IdpConfig.TwitterBuilder().build(), ) // Create and launch sign-in intent val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .build() signInLauncher.launch(signInIntent)
Java
// Choose authentication providers List<AuthUI.IdpConfig> providers = Arrays.asList( new AuthUI.IdpConfig.EmailBuilder().build(), new AuthUI.IdpConfig.PhoneBuilder().build(), new AuthUI.IdpConfig.GoogleBuilder().build(), new AuthUI.IdpConfig.FacebookBuilder().build(), new AuthUI.IdpConfig.TwitterBuilder().build()); // Create and launch sign-in intent Intent signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .build(); signInLauncher.launch(signInIntent);
После завершения процесса авторизации вы получите результат в onSignInResult :
Kotlin
private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) { val response = result.idpResponse if (result.resultCode == RESULT_OK) { // Successfully signed in val user = FirebaseAuth.getInstance().currentUser // ... } else { // Sign in failed. If response is null the user canceled the // sign-in flow using the back button. Otherwise check // response.getError().getErrorCode() and handle the error. // ... } }
Java
private void onSignInResult(FirebaseAuthUIAuthenticationResult result) { IdpResponse response = result.getIdpResponse(); if (result.getResultCode() == RESULT_OK) { // Successfully signed in FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); // ... } else { // Sign in failed. If response is null the user canceled the // sign-in flow using the back button. Otherwise check // response.getError().getErrorCode() and handle the error. // ... } }
Настройка способов входа в систему
Аутентификация по ссылке электронной почты
В консоли Firebase перейдите в раздел Безопасность > Аутентификация .
На вкладке «Способ входа» включите способ входа по электронной почте/паролю . Обратите внимание, что для использования входа по ссылке из электронного письма необходимо включить вход по электронной почте/паролю.
В этом же разделе включите способ входа по ссылке электронной почты (вход без пароля) и нажмите «Сохранить» .
Для использования входа по ссылке из электронной почты также необходимо включить Firebase Dynamic Links :
В консоли Firebase перейдите в раздел DevOps & Engagement > Dynamic Links .
Нажмите «Начать» , а затем добавьте домен. Выбранный вами домен будет отображаться в ссылках электронных писем, отправляемых вашим пользователям.
Включить подпись по ссылке в электронной почте в FirebaseUI можно, вызвав метод
enableEmailLinkSignInдля экземпляраEmailBuilder. Также потребуется предоставить действительный объектActionCodeSettingsс параметромsetHandleCodeInApp, установленным в значение true.Кроме того, необходимо добавить URL-адрес, передаваемый в
setUrl, в белый список:В консоли Firebase перейдите в раздел Безопасность > Аутентификация > Вкладка Настройки .
В разделе «Авторизованные домены» нажмите «Добавить домен» и добавьте свой домен.
Kotlin
val actionCodeSettings = ActionCodeSettings.newBuilder() .setAndroidPackageName( // yourPackageName= "...", // installIfNotAvailable= true, // minimumVersion= null, ) .setHandleCodeInApp(true) // This must be set to true .setUrl("https://google.com") // This URL needs to be whitelisted .build() val providers = listOf( EmailBuilder() .enableEmailLinkSignIn() .setActionCodeSettings(actionCodeSettings) .build(), ) val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .build() signInLauncher.launch(signInIntent)
Java
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder() .setAndroidPackageName( /* yourPackageName= */ "...", /* installIfNotAvailable= */ true, /* minimumVersion= */ null) .setHandleCodeInApp(true) // This must be set to true .setUrl("https://google.com") // This URL needs to be whitelisted .build(); List<AuthUI.IdpConfig> providers = Arrays.asList( new AuthUI.IdpConfig.EmailBuilder() .enableEmailLinkSignIn() .setActionCodeSettings(actionCodeSettings) .build() ); Intent signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .build(); signInLauncher.launch(signInIntent);
Если вы хотите получить доступ к ссылке в конкретном действии, пожалуйста, выполните действия, описанные здесь . В противном случае ссылка будет перенаправлять на ваше основное действие.
Как только вы перейдете по прямой ссылке, вам нужно будет проверить, можем ли мы ее обработать. Если можем, вам нужно будет передать ее нам через
setEmailLink.Kotlin
if (AuthUI.canHandleIntent(intent)) { val extras = intent.extras ?: return val link = extras.getString("email_link_sign_in") if (link != null) { val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setEmailLink(link) .setAvailableProviders(providers) .build() signInLauncher.launch(signInIntent) } }
Java
if (AuthUI.canHandleIntent(getIntent())) { if (getIntent().getExtras() == null) { return; } String link = getIntent().getExtras().getString("email_link_sign_in"); if (link != null) { Intent signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setEmailLink(link) .setAvailableProviders(providers) .build(); signInLauncher.launch(signInIntent); } }
Поддерживается необязательная авторизация по электронной почте на разных устройствах, что означает, что ссылка, отправленная через ваше приложение для Android, может использоваться для входа в ваши веб-приложения или приложения Apple. По умолчанию поддержка разных устройств включена. Вы можете отключить ее, вызвав метод
setForceSameDeviceдля экземпляраEmailBuilder.Дополнительную информацию см. в FirebaseUI-Web и FirebaseUI-iOS .
Выход
FirebaseUI предоставляет удобные способы выхода из системы Firebase Authentication, а также из всех социальных систем идентификации:
Kotlin
AuthUI.getInstance() .signOut(this) .addOnCompleteListener { // ... }
Java
AuthUI.getInstance() .signOut(this) .addOnCompleteListener(new OnCompleteListener<Void>() { public void onComplete(@NonNull Task<Void> task) { // ... } });
Вы также можете полностью удалить учетную запись пользователя:
Kotlin
AuthUI.getInstance() .delete(this) .addOnCompleteListener { // ... }
Java
AuthUI.getInstance() .delete(this) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // ... } });
Настройка
По умолчанию FirebaseUI использует AppCompat для оформления тем, что означает, что он автоматически подберет цветовую схему вашего приложения. Если вам требуется дополнительная настройка, вы можете передать тему и логотип в конструктор Intent для входа в систему:
Kotlin
val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .setLogo(R.drawable.my_great_logo) // Set logo drawable .setTheme(R.style.MySuperAppTheme) // Set theme .build() signInLauncher.launch(signInIntent)
Java
Intent signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .setLogo(R.drawable.my_great_logo) // Set logo drawable .setTheme(R.style.MySuperAppTheme) // Set theme .build(); signInLauncher.launch(signInIntent);
Вы также можете установить собственную политику конфиденциальности и условия предоставления услуг:
Kotlin
val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .setTosAndPrivacyPolicyUrls( "https://example.com/terms.html", "https://example.com/privacy.html", ) .build() signInLauncher.launch(signInIntent)
Java
Intent signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers) .setTosAndPrivacyPolicyUrls( "https://example.com/terms.html", "https://example.com/privacy.html") .build(); signInLauncher.launch(signInIntent);
Следующие шаги
- Для получения дополнительной информации об использовании и настройке FirebaseUI см. файл README на GitHub.
- Если вы обнаружили проблему в FirebaseUI и хотите сообщить о ней, воспользуйтесь системой отслеживания ошибок GitHub .