在 Android 上匿名进行 Firebase 身份验证

您可以使用 Firebase Authentication 创建和使用临时匿名账号来进行 Firebase 身份验证。借助临时匿名账号,尚未注册应用的用户也可以使用受安全规则保护的数据。如果匿名用户决定注册您的应用,您可以将匿名用户的登录凭据与匿名账号关联,这样他们就可以在以后的会话中继续使用其受保护的数据。

准备工作

  1. 将 Firebase 添加到您的 Android 项目(如果尚未添加)。
  2. 模块(应用级)Gradle 文件(通常是 <project>/<app-module>/build.gradle.kts<project>/<app-module>/build.gradle)中,添加 Firebase Authentication 库的依赖项。我们建议使用 Firebase Android BoM 来实现库版本控制。
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.6.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 库的兼容版本。

    (替代方法) 在不使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 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.1.0")
    }
    是否想要查找 Kotlin 专用的库模块?2023 年 10 月 (Firebase BoM 32.5.0) 开始,Kotlin 和 Java 开发者可以依赖于主库模块(如需了解详情,请参阅关于此计划的常见问题解答)。
  3. 如果您尚未将您的应用与 Firebase 项目关联,请在 Firebase 控制台中进行关联。
  4. 启用匿名身份验证:
    1. Firebase 控制台中,打开 Auth 部分。
    2. Sign-in Methods(登录方法)页面中,启用匿名登录方法。
    3. 可选:如果您已将项目升级为采用 Firebase Authentication with Identity Platform,则可以启用自动清理。启用此设置后,系统会自动删除超过 30 天的匿名账号。在启用了自动清理的项目中,匿名身份验证将不再计入用量限额或结算配额。请参阅自动清理

匿名进行 Firebase 身份验证

要使未登录的用户能够使用需要进行 Firebase 身份验证的应用功能,您可以通过以下步骤让用户匿名登录:

  1. 在 Activity 的 onCreate 方法中,获取 FirebaseAuth 对象的共享实例:

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. 初始化 Activity 时,请检查用户当前是否已登录:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    Java

    @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 以匿名用户身份登录:

    Kotlin+KTX

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

    Java

    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 登录

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Facebook 登录

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    电子邮件地址与密码登录

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  3. AuthCredential 对象传递给登录用户的 linkWithCredential 方法:

    Kotlin+KTX

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

    Java

    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 数据库中的数据的访问权限。