Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

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

    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 для входа в систему и еще не определены вашего приложения SHA-1 отпечатка пальца, сделайте это с странице Настройки консоли Firebase. См Аутентификация своего клиента Подробные сведения о том , как получить своего приложения SHA-1 отпечатка пальца.

  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 активности:

Джава

// 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);
            }
        }
);

Котлин + KTX

// See: https://developer.android.com/training/basics/intents/result
private val signInLauncher = registerForActivityResult(
        FirebaseAuthUIActivityResultContract()
) { res ->
    this.onSignInResult(res)
}

Чтобы запустить процесс входа в FirebaseUI, создайте намерение входа с помощью предпочитаемых вами методов входа:

Джава

// 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);

Котлин + 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)

Когда вход в потоке будет завершен, вы получите результат в onSignInResult :

Джава

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.
        // ...
    }
}

Котлин + 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.
        // ...
    }
}

Настроить методы входа

  1. В Firebase консоли откройте раздел Проверка подлинности. На вкладке Вход в метод, позволяют поставщику Email / пароль. Обратите внимание, что вход по электронной почте / паролю должен быть включен, чтобы использовать ссылку для входа по электронной почте.

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

  3. Вы также должны включить Firebase Dynamic Ссылку на использование электронной почты подключаемого знак в. В Firebase консоли , нажмите на динамических ссылках под Engage в навигационной панели. Нажмите на Начало и добавить домен. Выбранный здесь домен будет отражен в электронных письмах, отправленных вашим пользователям.

  4. Вы можете включить электронную ссылку в знак в FirebaseUI, вызвав enableEmailLinkSignIn на EmailBuilder экземпляре. Вам также необходимо предоставить действительный ActionCodeSettings объект с setHandleCodeInApp значение ИСТИНА. Кроме того, вы должны белый список URL вы передаете setUrl , что может быть сделано в Firebase консоли , проверка подлинности -> Вход в Methods -> Уполномоченные домены.

    Джава

    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);

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

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

    Джава

    if (AuthUI.canHandleIntent(getIntent())) {
        if (getIntent().getExtras() == null) {
            return;
        }
        String link = getIntent().getExtras().getString(ExtraConstants.EMAIL_LINK_SIGN_IN);
        if (link != null) {
            Intent signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build();
            signInLauncher.launch(signInIntent);
        }
    }

    Котлин + KTX

    if (AuthUI.canHandleIntent(intent)) {
        val extras = intent.extras ?: return
        val link = extras.getString(ExtraConstants.EMAIL_LINK_SIGN_IN)
        if (link != null) {
            val signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build()
            signInLauncher.launch(signInIntent)
        }
    }
  7. Дополнительное устройство Cross ссылка электронной почты знак в поддерживается, что означает , что ссылка , отправленная через ваш Android приложение может быть использовано для войти на вашем веб или Apple , приложения. По умолчанию поддержка нескольких устройств включена. Вы можете отключить его, вызвав setForceSameDevice на EmailBuilder инстанции.

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

Выход

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

Джава

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

Котлин + KTX

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

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

Джава

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

Котлин + KTX

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

Настройка

По умолчанию FirebaseUI использует AppCompat для создания тем, что означает, что он естественным образом принимает цветовую схему вашего приложения. Если вам требуется дополнительная настройка вы можете передать тему и логотип на знак в Intent строитель:

Джава

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);

Котлин + 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)

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

Джава

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build();
signInLauncher.launch(signInIntent);

Котлин + KTX

val 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 .