透過 FirebaseUI 輕鬆將登入程序新增至 Android 應用程式

FirebaseUI Auth 是以 Firebase 驗證 SDK 為基礎建構的程式庫,提供可直接使用的 UI 流程,方便您在應用程式中使用。

建議的登入流程會使用 Compose 畫面。如要瞭解仍使用 Activity 的應用程式,請參閱「現有以 Activity 為基礎的應用程式」一節。

FirebaseUI Auth 具有下列優點:

  • 多個供應商:電子郵件/密碼、電話、Google、Facebook、Apple、GitHub、Microsoft、Yahoo、Twitter、匿名驗證和自訂 OAuth 的登入流程。
  • 帳戶管理:處理帳戶管理工作的流程,例如建立帳戶和重設密碼。
  • 帳戶連結:安全地連結不同身分識別供應商的使用者帳戶。
  • 匿名使用者升級:安全升級匿名使用者的流程。
  • 自訂主題:支援 Material 3 UI,可沿用應用程式主題。此外,由於 FirebaseUI 是開放原始碼,您可以將專案分支化,並根據需求自訂。
  • Credential Manager:自動整合Credential Manager,方便使用者快速跨裝置登入。
  • 多重驗證:支援簡訊和 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-services Gradle 外掛程式會自動提供 Google 登入設定。確認您已在 Firebase 控制台中啟用 Google 登入。

Facebook 登入

如果使用 Facebook 登入,請將 Facebook 應用程式 ID 新增至 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 控制台中設定,但不需要額外的 Android 專屬設定。如需特定供應商的操作說明,請參閱 Firebase 驗證說明文件

選擇要加入 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,
                    )
                },
            )
        )
    }
}

如要瞭解完整的深層連結處理流程,請參閱 GitHub 中 README 的「Email Link Sign-In」一節

登入

建立 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 樣式。
  • 支援 Credential Manager。
  • 透過直接回呼處理錯誤。

登出

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.DefaultAuthUITheme.DefaultDarkAuthUITheme.Adaptive
  • 使用 AuthUITheme.fromMaterialTheme() 繼承應用程式主題。
  • 使用 .copy() 自訂預設主題。
  • 建立完全自訂的 AuthUITheme
  • authUIConfiguration 中設定標誌、《服務條款》網址和《隱私權政策》網址。

如需完整的主題和自訂詳細資料,包括主題優先順序、供應商按鈕樣式和自訂主題,請參閱 GitHub 中 README 的「主題和自訂」一節

現有以活動為依據的應用程式

如果應用程式仍使用 Activity 和 Activity Result API,您可以透過 AuthFlowController 保留以 Activity 為基礎的啟動流程:

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