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

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

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

Прежде чем вы начнете

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

  2. Добавьте зависимости для FirebaseUI в файл build.gradle уровня приложения. Если вы хотите поддерживать вход с помощью Facebook или Twitter, также включите Facebook и Twitter SDK:

    dependencies {
        // ...
    
        implementation 'com.firebaseui:firebase-ui-auth:7.2.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 Auth имеет транзитивные зависимости от Firebase SDK и SDK сервисов Google Play.

  3. В консоли Firebase откройте раздел «Аутентификация» и включите методы входа, которые вы хотите поддерживать. Для некоторых методов входа требуется дополнительная информация, обычно доступная в консоли разработчика службы.

  4. Если вы включили вход через Google:

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

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

    3. Если вы еще не указали отпечаток SHA своего приложения, сделайте это на странице настроек консоли Firebase. Подробную информацию о том, как получить отпечаток SHA вашего приложения, см. в разделе Аутентификация вашего клиента .

  5. Если вы поддерживаете вход через 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 , который регистрирует обратный вызов для контракта результата действия FirebaseUI:

Kotlin+KTX

// 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+KTX

// 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+KTX

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. Вам также необходимо включить динамические ссылки Firebase, чтобы использовать вход по электронной почте. В консоли Firebase нажмите «Динамические ссылки» в разделе «Включить» на панели навигации. Нажмите «Начало работы» и добавьте домен. Выбранный здесь домен будет отображаться в ссылках электронной почты, отправляемых вашим пользователям.

  4. Вы можете включить вход по ссылке электронной почты в FirebaseUI, вызвав enableEmailLinkSignIn в экземпляре EmailBuilder . Вам также потребуется предоставить действительный объект ActionCodeSettings с setHandleCodeInApp , для которого задано значение true. Кроме того, вам необходимо внести в белый список URL-адрес, который вы передаете setUrl , что можно сделать в консоли Firebase , в разделе «Аутентификация» -> «Методы входа» -> «Авторизованные домены».

    Kotlin+KTX

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

  6. Как только вы поймаете глубокую ссылку, вам нужно будет позвонить, чтобы убедиться, что мы можем обработать ее для вас. Если мы можем, вам нужно передать его нам через setEmailLink .

    Kotlin+KTX

    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);
        }
    }
  7. Поддерживается необязательный вход по ссылке электронной почты на нескольких устройствах, что означает, что ссылку, отправленную через ваше приложение Android, можно использовать для входа в веб-приложения или приложения Apple. По умолчанию поддержка нескольких устройств включена. Вы можете отключить его, вызвав setForceSameDevice для экземпляра EmailBuilder .

    См. FirebaseUI-Web и FirebaseUI-iOS для получения дополнительной информации.

Выход

FirebaseUI предоставляет удобные методы для выхода из Firebase Authentication, а также из всех поставщиков социальных сетей:

Kotlin+KTX

AuthUI.getInstance()
    .signOut(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Вы также можете полностью удалить учетную запись пользователя:

Kotlin+KTX

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+KTX

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+KTX

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 .