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

FirebaseUI — это библиотека, построенная на основе Firebase Authentication SDK, которая предоставляет готовые сценарии пользовательского интерфейса для использования в вашем приложении. FirebaseUI предоставляет следующие преимущества:

  • Поддержка нескольких провайдеров — варианты авторизации по электронной почте/паролю, ссылке из электронной почты, аутентификации по телефону, входу через Google, входу через Facebook, входу через Twitter и входу через GitHub.
  • Управление учетными записями — процессы для выполнения задач по управлению учетными записями, таких как создание учетных записей и сброс паролей.
  • Связывание учетных записей — процессы для безопасного связывания учетных записей пользователей в разных системах идентификации.
  • Обновление учетных записей анонимных пользователей — алгоритмы для безопасного обновления учетных записей анонимных пользователей.
  • Пользовательские темы — настройте внешний вид FirebaseUI в соответствии с вашим приложением. Кроме того, поскольку FirebaseUI является проектом с открытым исходным кодом, вы можете создать форк проекта и настроить его в точном соответствии с вашими потребностями.
  • Менеджер учетных данных — автоматическая интеграция с Менеджером учетных данных для быстрой авторизации на разных устройствах.

Прежде чем начать

  1. Если вы еще этого не сделали, добавьте Firebase в свой Android-проект .

  2. Добавьте зависимости 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.

  3. В консоли Firebase перейдите в раздел Безопасность > Аутентификация .

  4. На вкладке «Способ входа» включите поддерживаемые вами поставщики услуг входа. Некоторые поставщики услуг входа требуют дополнительной информации, обычно доступной в консоли разработчика сервиса.

  5. Если у вас включен вход через Google:

    1. Обновите файл конфигурации Firebase.

      1. При появлении соответствующего запроса в консоли Firebase загрузите обновленный конфигурационный файл Firebase ( google-services.json ), который теперь содержит информацию о клиенте OAuth, необходимую для входа через Google.

      2. Переместите этот обновленный конфигурационный файл в свой проект Android Studio, заменив им устаревший соответствующий конфигурационный файл. (См. раздел «Добавление Firebase в ваш проект Android» .)

    2. Укажите SHA-1-отпечаток вашего приложения, если вы еще этого не сделали.

      1. В консоли Firebase перейдите в... > Вкладка «Общие» .

      2. Прокрутите вниз до карточки «Ваши приложения» , выберите свое приложение для Android и добавьте отпечаток SHA-1 в поле «Отпечатки сертификатов SHA» .

      Подробную информацию о том, как получить SHA-отпечаток вашего приложения, см. в разделе «Аутентификация клиента» .

  6. Если вы поддерживаете вход через 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.
        // ...
    }
}

Настройка способов входа в систему

  1. В консоли Firebase перейдите в раздел Безопасность > Аутентификация .

  2. На вкладке «Способ входа» включите способ входа по электронной почте/паролю . Обратите внимание, что для использования входа по ссылке из электронного письма необходимо включить вход по электронной почте/паролю.

  3. В этом же разделе включите способ входа по ссылке электронной почты (вход без пароля) и нажмите «Сохранить» .

  4. Для использования входа по ссылке из электронной почты также необходимо включить Firebase Dynamic Links :

    1. В консоли Firebase перейдите в раздел DevOps & Engagement > Dynamic Links .

    2. Нажмите «Начать» , а затем добавьте домен. Выбранный вами домен будет отображаться в ссылках электронных писем, отправляемых вашим пользователям.

  5. Включить подпись по ссылке в электронной почте в FirebaseUI можно, вызвав метод enableEmailLinkSignIn для экземпляра EmailBuilder . Также потребуется предоставить действительный объект ActionCodeSettings с параметром setHandleCodeInApp , установленным в значение true.

    Кроме того, необходимо добавить URL-адрес, передаваемый в setUrl , в белый список:

    1. В консоли Firebase перейдите в раздел Безопасность > Аутентификация > Вкладка Настройки .

    2. В разделе «Авторизованные домены» нажмите «Добавить домен» и добавьте свой домен.

    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);
  6. Если вы хотите получить доступ к ссылке в конкретном действии, пожалуйста, выполните действия, описанные здесь . В противном случае ссылка будет перенаправлять на ваше основное действие.

  7. Как только вы перейдете по прямой ссылке, вам нужно будет проверить, можем ли мы ее обработать. Если можем, вам нужно будет передать ее нам через 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);
        }
    }
  8. Поддерживается необязательная авторизация по электронной почте на разных устройствах, что означает, что ссылка, отправленная через ваше приложение для 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 .