在 Android 上透過 Firebase 匿名驗證

您可以使用 Firebase Authentication 建立及使用臨時匿名帳戶,以便透過 Firebase 進行驗證。這些臨時匿名帳戶可讓尚未註冊應用程式的使用者,使用受安全性規則保護的資料。如果匿名使用者決定註冊您的應用程式,您可以將他們的登入憑證連結至匿名帳戶,讓他們在日後的工作階段繼續使用受保護的資料。

事前準備

  1. 如果您尚未將 Firebase 新增至 Android 專案,請新增 Firebase
  2. 模組 (應用程式層級) Gradle 檔案 (通常為 <project>/<app-module>/build.gradle.kts<project>/<app-module>/build.gradle) 中,加入 Android 的 Firebase Authentication 程式庫依附元件。建議您使用 Firebase Android BoM 來控管程式庫版本。
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.10.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    只要使用 Firebase Android BoM,應用程式就會一律使用相容的 Firebase Android 程式庫版本。

    如果您選擇不使用 Firebase BoM,則必須在依附元件行中指定每個 Firebase 程式庫版本。

    請注意,如果您在應用程式中使用多個 Firebase 程式庫,強烈建議您使用 BoM 來管理程式庫版本,確保所有版本皆相容。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.2.0")
    }
    想尋找 Kotlin 專屬的程式庫模組嗎?2023 年 10 月 (Firebase BoM 32.5.0)起,Kotlin 和 Java 開發人員都可以依附主要程式庫模組 (詳情請參閱這項計畫的常見問題)。
  3. 如果您尚未將應用程式連結至 Firebase 專案,請透過 Firebase 主控台連結。
  4. 啟用匿名驗證:
    1. Firebase 控制台中,開啟「Auth」部分。
    2. 在「Sign-in Methods」頁面中,啟用「Anonymous」登入方法。
    3. 選用:如果您已將專案升級至 Firebase Authentication with Identity Platform,可以啟用自動清理功能。啟用這項設定後,系統就會自動刪除建立至今超過 30 天的匿名帳戶。在啟用自動清理功能的專案中,匿名驗證功能就不會計入用量限制或計費配額。請參閱「自動清理」一文。

以匿名身分驗證 Firebase

如果已登出的使用者使用需要透過 Firebase 驗證的應用程式功能,請完成下列步驟,讓使用者以匿名身分登入:

  1. 在活動的 onCreate 方法中,取得 FirebaseAuth 物件的共用例項:
    KotlinJava
    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth
    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. 初始化活動時,請檢查使用者目前是否已登入:
    KotlinJava
    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }
    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }
  3. 最後,請呼叫 signInAnonymously 以匿名使用者身分登入:
    KotlinJava
    auth.signInAnonymously()
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInAnonymously:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInAnonymously:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }
    mAuth.signInAnonymously()
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInAnonymously:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInAnonymously:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    如果登入成功,您可以使用 getCurrentUser 方法取得使用者的帳戶資料。

將匿名帳戶轉換為永久帳戶

當匿名使用者註冊應用程式時,您可能會想讓他們繼續使用新帳戶進行工作。舉例來說,您可以讓使用者在註冊前將商品加入購物車,並在他們的新帳戶購物車中顯示這些商品。如要這樣做,請完成下列步驟:

  1. 使用者註冊時,請完成使用者驗證提供者的登入流程,但不包含呼叫其中一個 FirebaseAuth.signInWith 方法。例如取得使用者的 Google ID 權杖、Facebook 存取權杖,或電子郵件地址和密碼。
  2. 取得新驗證供應器的 AuthCredential

    Google 登入
    KotlinJava
    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Facebook 登入
    KotlinJava
    val credential = FacebookAuthProvider.getCredential(token.token)
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    電子郵件地址和密碼登入
    KotlinJava
    val credential = EmailAuthProvider.getCredential(email, password)
    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  3. AuthCredential 物件傳遞至登入使用者的 linkWithCredential 方法:

    KotlinJava
    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }
    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

如果對 linkWithCredential 的呼叫成功,使用者的新帳戶就能存取匿名帳戶的 Firebase 資料。

自動清除

如果您已將專案升級至 Firebase Authentication with Identity Platform,可以在 Firebase 主控台中啟用自動清理功能。啟用這項功能後,Firebase 就會自動刪除建立至今超過 30 天的匿名帳戶。在啟用自動清理功能的專案中,匿名驗證不會計入用量限制或計費配額。

  • 啟用自動清理功能後建立的所有匿名帳戶,可能會在建立後 30 天後的任何時間自動刪除。
  • 啟用自動清理功能後,現有的匿名帳戶會在 30 天後自動刪除。
  • 如果您關閉自動清理功能,所有已排定要刪除的匿名帳戶都會維持原先的刪除排程。
  • 如果您將匿名帳戶連結至任何登入方式,系統就不會自動刪除該帳戶。

如果您想在啟用這項功能前查看受影響的使用者人數,且已將專案升級至 Firebase Authentication with Identity Platform,可以在 Cloud Logging 中依 is_anon 篩選。

後續步驟

使用者現在可以透過 Firebase 進行驗證,您可以使用 Firebase 規則控制使用者對 Firebase 資料庫中資料的存取權。

Firebase gives you the tools and infrastructure you need to build better mobile and web apps, improve app quality, and grow your business.

更新時間:Mar 7, 2025