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

FirebaseUI 是一個建構程式庫 Firebase Authentication SDK 上方提供了直接的 UI 流程 。FirebaseUI 具備下列優點:

  • 多個供應商:電子郵件/密碼、電子郵件連結、電話的登入流程 驗證、Google 登入、Facebook 登入、Twitter 登入和 GitHub 登入。
  • 帳戶管理:處理帳戶管理工作的流程,例如 建立帳戶及重設密碼。
  • 帳戶連結:跨身分安全連結使用者帳戶的程序 以滿足需求
  • 匿名使用者升級:匿名使用者升級流程。
  • 自訂主題:配合應用程式自訂 FirebaseUI 的外觀。另外, 因為 FirebaseUI 是開放原始碼 符合您的需求
  • 密碼專用 Smart Lock - 自動與以下項目整合: 密碼專用 Smart Lock 快速跨裝置登入。

事前準備

  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'
    }
    

    FirebaseUI Auth SDK 在 Firebase SDK 和 Google Play 服務 SDK

  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 控制台開啟「驗證」專區。每月中的特定幾天 「Sign in method」分頁,啟用「Email/Password」供應商。注意事項 必須啟用電子郵件/密碼登入功能才能使用電子郵件連結登入。

  2. 在同一部分中啟用「電子郵件連結 (無密碼登入)」登入功能 方法並點選「儲存」

  3. 您也必須啟用 Firebase Dynamic Links,才能使用電子郵件連結登入。在 Firebase 控制台,按一下導覽列的「Engage」下方的「Dynamic Links」,按一下 開始使用並加入網域。您在這裡選擇的網域將會顯示在電子郵件中 傳送給使用者的連結。

  4. 您可以在 FirebaseUI 中啟用電子郵件連結登入功能,方法是在enableEmailLinkSignIn EmailBuilder 執行個體。您還需要提供一個有效的 ActionCodeSettings 物件,包括 setHandleCodeInApp 設為 true。此外,請將傳遞到哪個網址加入許可清單? 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 應用程式可用於登入網站或應用程式。系統預設會提供跨裝置支援 您可以在 EmailBuilder 執行個體上呼叫 setForceSameDevice 來停用此功能。

    請參閱 FirebaseUI-WebFirebaseUI-iOS 瞭解詳情

登出

FirebaseUI 提供登出 Firebase 驗證的便利方法 以及所有社交身分提供者:

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

後續步驟