获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

使用电话号码在 Android 上通过 Firebase 进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以使用 Firebase 身份验证通过向用户手机发送 SMS 消息来登录用户。用户使用 SMS 消息中包含的一次性代码登录。

将电话号码登录添加到您的应用程序的最简单方法是使用FirebaseUI ,它包括一个插入式登录小部件,用于实现电话号码登录以及基于密码和联合登录的登录流程-在。本文档介绍如何使用 Firebase SDK 实现电话号码登录流程。

在你开始之前

  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. 如果您尚未在Firebase 控制台中设置应用的 SHA-1 哈希,请执行此操作。有关查找应用程序的 SHA-1 哈希的信息,请参阅验证您的客户端

安全问题

仅使用电话号码的身份验证虽然方便,但不如其他可用方法安全,因为电话号码的拥有可以在用户之间轻松转移。此外,在具有多个用户配置文件的设备上,任何可以接收 SMS 消息的用户都可以使用设备的电话号码登录帐户。

如果您在应用程序中使用基于电话号码的登录,则应将其与更安全的登录方法一起提供,并告知用户使用电话号码登录的安全权衡。

为您的 Firebase 项目启用电话号码登录

要通过短信登录用户,您必须首先为您的 Firebase 项目启用电话号码登录方法:

  1. Firebase 控制台中,打开身份验证部分。
  2. 登录方式页面,启用电话号码登录方式。

Firebase 的电话号码登录请求配额足够高,大多数应用不会受到影响。但是,如果您需要使用电话身份验证登录大量用户,则可能需要升级您的定价计划。请参阅定价页面。

启用应用验证

要使用电话号码身份验证,Firebase 必须能够验证电话号码登录请求是否来自您的应用。 Firebase 身份验证有两种方法可以完成此操作:

  • SafetyNet :如果用户的设备安装了 Google Play 服务,并且 Firebase 身份验证可以通过Android SafetyNet验证该设备是否合法,则可以继续使用电话号码登录。
  • 要启用 SafetyNet 以与 Firebase 身份验证一起使用:

    1. 在 Google Cloud Console 中,为您的项目启用Android DeviceCheck API 。将使用默认的 Firebase API 密钥,并且需要被允许访问 DeviceCheck API。
    2. 如果您尚未指定应用的 SHA-256 指纹,请从 Firebase 控制台的设置页面执行此操作。有关如何获取应用程序的 SHA-256 指纹的详细信息,请参阅验证您的客户端
  • reCAPTCHA 验证:在无法使用 SafetyNet 的情况下,例如当用户没有 Google Play 服务支持时,或者在模拟器上测试您的应用时,Firebase 身份验证使用 reCAPTCHA 验证来完成手机登录流程。 reCAPTCHA 挑战通常可以在用户无需解决任何问题的情况下完成。请注意,此流程要求 SHA-1 与您的应用程序相关联。此流程还要求您的 API 密钥不受限制或被列入“${PROJECT_NAME}.firebaseapp.com”的许可名单。

向用户手机发送验证码

要启动电话号码登录,请向用户显示一个界面,提示他们输入电话号码。法律要求各不相同,但作为最佳实践并为您的用户设定期望,您应该告知他们,如果他们使用电话登录,他们可能会收到一条短信进行验证,并适用标准费率。

然后,将他们的电话号码传递给PhoneAuthProvider.verifyPhoneNumber方法以请求 Firebase 验证用户的电话号码。例如:

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // Activity (for callback binding)
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber)       // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this)                 // Activity (for callback binding)
    .setCallbacks(callbacks)          // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

verifyPhoneNumber方法是可重入的:如果您多次调用它,例如在一个活动的onStart方法中, verifyPhoneNumber方法将不会发送第二条 SMS,除非原始请求已超时。

如果您的应用在用户登录之前关闭(例如,当用户正在使用他们的 SMS 应用时),您可以使用此行为来恢复电话号码登录过程。调用verifyPhoneNumber后,设置一个标志,指示验证正在进行中。然后,将标志保存在 Activity 的onSaveInstanceState方法中,并在onRestoreInstanceState中恢复标志。最后,在 Activity 的onStart方法中,检查是否已经在进行验证,如果是,则再次调用verifyPhoneNumber 。确保在验证完成或失败时清除标志(请参阅验证回调)。

要轻松处理屏幕旋转和其他 Activity 重启实例,请将您的 Activity 传递给verifyPhoneNumber方法。 Activity 停止时回调会自动分离,因此您可以在回调方法中自由编写 UI 转换代码。

Firebase 发送的 SMS 消息也可以通过在 Auth 实例上的setLanguageCode方法指定身份验证语言来本地化。

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

当您调用PhoneAuthProvider.verifyPhoneNumber时,您还必须提供OnVerificationStateChangedCallbacks的实例,其中包含处理请求结果的回调函数的实现。例如:

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

验证回调

在大多数应用程序中,您实现了onVerificationCompletedonVerificationFailedonCodeSent回调。您还可以实现onCodeAutoRetrievalTimeOut ,具体取决于您的应用程序的要求。

onVerificationCompleted(PhoneAuthCredential)

该方法在两种情况下调用:

  • 即时验证:在某些情况下,无需发送或输入验证码即可即时验证电话号码。
  • 自动检索:在某些设备上,Google Play 服务可以自动检测传入的验证短信并执行验证,无需用户操作。 (某些运营商可能不提供此功能。)这使用SMS Retriever API ,它在 SMS 消息的末尾包含 11 个字符的哈希。
无论哪种情况,用户的电话号码都已成功验证,您可以使用传递给回调的PhoneAuthCredential对象来登录用户

onVerificationFailed(FirebaseException)

调用此方法以响应无效的验证请求,例如指定无效电话号码或验证码的请求。

onCodeSent(字符串验证 ID,PhoneAuthProvider.ForceResendingToken)

可选的。在验证码通过短信发送到提供的电话号码后调用此方法。

调用此方法时,大多数应用程序会显示一个 UI,提示用户键入 SMS 消息中的验证码。 (同时,自动验证可能在后台进行。)然后,在用户输入验证码后,您可以使用验证码和传递给该方法的验证 ID 创建一个PhoneAuthCredential对象,该对象您可以反过来用于登录用户。但是,某些应用可能会等到调用onCodeAutoRetrievalTimeOut后才会显示验证码 UI(不推荐)。

onCodeAutoRetrievalTimeOut(字符串验证 ID)

可选的。在为verifyPhoneNumber指定的超时持续时间已过且未先触发onVerificationCompleted后调用此方法。在没有 SIM 卡的设备上,会立即调用此方法,因为无法进行 SMS 自动检索。

一些应用程序会在自动验证期超时之前阻止用户输入,然后才会显示一个 UI,提示用户输入短信中的验证码(不推荐)。

创建一个 PhoneAuthCredential 对象

在用户输入 Firebase 发送到用户手机的验证码后,使用验证码和传递给onCodeSentonCodeAutoRetrievalTimeOut回调的验证 ID 创建一个PhoneAuthCredential对象。 (调用onVerificationCompleted时,会直接得到一个PhoneAuthCredential对象,所以可以跳过这一步。)

要创建PhoneAuthCredential对象,请调用PhoneAuthProvider.getCredential

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

登录用户

获得PhoneAuthCredential对象后,无论是在onVerificationCompleted回调中还是通过调用PhoneAuthProvider.getCredential ,通过将PhoneAuthCredential对象传递给FirebaseAuth.signInWithCredential来完成登录流程:

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .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, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")

                    val user = task.result?.user
                } else {
                    // Sign in failed, display a message and update the UI
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    if (task.exception is FirebaseAuthInvalidCredentialsException) {
                        // The verification code entered was invalid
                    }
                    // Update UI
                }
            }
}

使用虚构的电话号码进行测试

您可以通过 Firebase 控制台设置用于开发的虚构电话号码。使用虚构的电话号码进行测试可带来以下好处:

  • 在不消耗您的使用配额的情况下测试电话号码身份验证。
  • 在不发送实际 SMS 消息的情况下测试电话号码身份验证。
  • 使用相同的电话号码运行连续测试而不会受到限制。如果审核者碰巧使用相同的电话号码进行测试,这可以最大限度地降低 App Store 审核过程中被拒绝的风险。
  • 无需任何额外工作即可在开发环境中轻松进行测试,例如无需 Google Play 服务即可在 iOS 模拟器或 Android 模拟器中进行开发。
  • 编写集成测试,而不会被通常应用于生产环境中真实电话号码的安全检查所阻止。

虚构电话号码必须满足以下要求:

  1. 确保您使用的电话号码确实是虚构的,并且不存在。 Firebase 身份验证不允许您将真实用户使用的现有电话号码设置为测试号码。一种选择是使用 555 前缀号码作为美国测试电话号码,例如: +1 650-555-3434
  2. 必须针对长度和其他限制正确格式化电话号码。他们仍将通过与真实用户电话号码相同的验证。
  3. 您最多可以添加 10 个电话号码进行开发。
  4. 使用难以猜测的测试电话号码/代码并经常更改。

创建虚构的电话号码和验证码

  1. Firebase 控制台中,打开身份验证部分。
  2. 登录方法选项卡中,启用电话提供商(如果您尚未启用)。
  3. 打开用于测试手风琴的电话号码菜单。
  4. 提供您要测试的电话号码,例如: +1 650-555-3434
  5. 提供该特定号码的 6 位验证码,例如: 654321
  6. 添加号码。如果需要,您可以通过将鼠标悬停在相应行上并单击垃圾桶图标来删除电话号码及其代码。

手动测试

您可以直接在应用程序中开始使用虚构的电话号码。这允许您在开发阶段执行手动测试,而不会遇到配额问题或限制。您也可以直接从没有安装 Google Play 服务的 iOS 模拟器或 Android 模拟器进行测试。

当您提供虚构的电话号码并发送验证码时,不会发送实际的短信。相反,您需要提供之前配置的验证码才能完成登录。

登录完成后,会使用该电话号码创建一个 Firebase 用户。用户具有与真实电话号码用户相同的行为和属性,并且可以以相同的方式访问实时数据库/Cloud Firestore 和其他服务。在此过程中铸造的 ID 令牌与真实电话号码用户具有相同的签名。

如果您想进一步限制访问,另一种选择是通过对这些用户的自定义声明设置测试角色,以将他们区分为假用户。

要手动触发 reCAPTCHA 流进行测试,请使用forceRecaptchaFlowForTesting()方法。

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

集成测试

除了手动测试之外,Firebase 身份验证还提供 API 来帮助编写电话身份验证测试的集成测试。这些 API 通过禁用 Web 中的 reCAPTCHA 要求和 iOS 中的静默推送通知来禁用应用程序验证。这使得这些流程中的自动化测试成为可能,并且更易于实施。此外,它们还有助于提供在 Android 上测试即时验证流程的能力。

在 Android 上,在signInWithPhoneNumber调用之前调用setAppVerificationDisabledForTesting() 。这会自动禁用应用程序验证,允许您传递电话号码而无需手动解决。请注意,即使 reCAPTCHA 和/或 SafetyNet 已禁用,使用真实电话号码仍无法完成登录。此 API 只能使用虚构电话号码。

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

使用虚构号码调用verifyPhoneNumber会触发onCodeSent回调,您需要在其中提供相应的验证码。这允许在 Android 模拟器中进行测试。

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(String verificationId,
                                   PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(30L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

            override fun onCodeSent(
                    verificationId: String,
                    forceResendingToken: PhoneAuthProvider.ForceResendingToken
            ) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                this@MainActivity.enableUserManuallyInputCode()
            }

            override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            override fun onVerificationFailed(e: FirebaseException) {
                // ...
            }
        })
        .build()
PhoneAuthProvider.verifyPhoneNumber(options)

此外,您可以通过调用setAutoRetrievedSmsCodeForPhoneNumber设置虚构号码及其对应的自动检索验证码来测试 Android 中的自动检索流程。

调用verifyPhoneNumber时,它会直接使用PhoneAuthCredential触发onVerificationCompleted 。这仅适用于虚构的电话号码。

将应用程序发布到 Google Play 商店时,请确保禁用此功能,并且您的应用程序中没有硬编码虚构的电话号码。

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            override fun onVerificationCompleted(credential: PhoneAuthCredential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build()
PhoneAuthProvider.verifyPhoneNumber(options)

下一步

用户首次登录后,会创建一个新用户帐户并将其链接到凭据(即用户名和密码、电话号码或身份验证提供商信息),即用户登录时使用的凭据。这个新帐户作为 Firebase 项目的一部分存储,可用于在项目中的每个应用中识别用户,无论用户如何登录。

  • 在您的应用中,您可以从FirebaseUser对象获取用户的基本个人资料信息。请参阅管理用户

  • 在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

您可以通过将身份验证提供程序凭据链接到现有用户帐户来允许用户使用多个身份验证提供程序登录您的应用程序。

要注销用户,请调用signOut

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()