Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

您可以使用 Firebase 身份验证来创建和使用临时匿名帐户来通过 Firebase 进行身份验证。这些临时匿名帐户可用于允许尚未注册您的应用的用户使用受安全规则保护的数据。如果匿名用户决定注册您的应用程序,您可以将他们的登录凭据链接到匿名帐户,以便他们可以在以后的会话中继续使用受保护的数据。

在你开始之前

  1. 如果您还没有,请将 Firebase 添加到您的 Android 项目中。
  2. 在您的模块(应用级)Gradle 文件(通常是<project>/<app-module>/build.gradle )中,添加 Firebase Authentication Android 库的依赖项。我们建议使用Firebase Android BoM来控制库版本控制。

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.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:21.1.0'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.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-ktx'
    }
    

    通过使用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-ktx:21.1.0'
    }
    
  3. 如果您尚未将应用连接到 Firebase 项目,请从Firebase 控制台执行此操作。
  4. 启用匿名身份验证:
    1. Firebase 控制台中,打开Auth部分。
    2. 登录方法页面上,启用匿名登录方法。
    3. 可选:如果您已使用 Identity Platform 将项目升级到 Firebase 身份验证,则可以启用自动清理。启用此设置后,超过 30 天的匿名帐户将被自动删除。在启用自动清理的项目中,匿名身份验证将不再计入使用限制或计费配额。请参阅自动清理

匿名使用 Firebase 进行身份验证

当已注销的用户使用需要通过 Firebase 进行身份验证的应用功能时,请完成以下步骤以匿名方式登录该用户:

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

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth
  2. 初始化 Activity 时,检查用户当前是否登录:

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

    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)
    }
  3. 最后,调用signInAnonymously以匿名用户身份登录:

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

    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)
                }
            }
    如果登录成功,您可以使用getCurrentUser方法获取用户的帐户数据。

将匿名帐户转换为永久帐户

当匿名用户注册您的应用程序时,您可能希望允许他们使用新帐户继续工作——例如,您可能希望让用户在注册之前添加到购物车中的商品在他们的新帐户中可用帐户的购物车。为此,请完成以下步骤:

  1. 当用户注册时,完成用户身份验证提供程序的登录流程,直至调用FirebaseAuth.signInWith方法之一,但不包括在内。例如,获取用户的 Google ID 令牌、Facebook 访问令牌或电子邮件地址和密码。
  2. 获取新身份验证提供程序的AuthCredential

    谷歌登录

    Java

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

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Facebook登入

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    电子邮件密码登录

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Kotlin+KTX

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

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

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

如果对linkWithCredential的调用成功,则用户的新帐户可以访问匿名帐户的 Firebase 数据。

自动清理

如果您已使用 Identity Platform 将项目升级到 Firebase 身份验证,则可以在 Firebase 控制台中启用自动清理。当您启用此功能时,Firebase 会自动删除超过 30 天的匿名帐户。在启用了自动清理的项目中,匿名身份验证将不计入使用限制或计费配额。

  • 在启用自动清理后创建的任何匿名帐户可能会在创建后 30 天后的任何时间自动删除。
  • 在启用自动清理之前创建的匿名帐户将有资格在启用自动清理后 30 天开始自动删除。
  • 如果您关闭自动清理,任何计划删除的匿名帐户都将保持计划删除。这些帐户不计入使用限制或计费配额。
  • 如果您通过将匿名帐户链接到任何登录方法来“升级”匿名帐户,则该帐户不会被自动删除。

如果您想在启用此功能之前查看有多少用户会受到影响,并且您已将项目升级到使用 Identity Platform 的 Firebase 身份验证,则可以在Cloud Logging中按is_anon进行过滤。

下一步

现在用户可以使用 Firebase 进行身份验证,您可以使用Firebase 规则控制他们对 Firebase 数据库中数据的访问。