Naar console

在 Android 上使用自定义身份验证系统进行 Firebase 身份验证

您可以将 Firebase 身份验证功能与自定义身份验证系统相集成,方法是修改身份验证服务器,使其在用户成功登录时生成自定义的签名令牌。您的应用会接收此令牌并将其用于 Firebase 身份验证。

准备工作

  1. 将 Firebase 添加到您的 Android 项目(如果尚未添加)。
  2. 请务必在您的项目级 build.gradle 文件中的 buildscriptallprojects 部分添加 Google 的 Maven 代码库。
  3. 将 Android 版 Firebase 身份验证库的依赖项添加到您的模块(应用级)Gradle 文件(通常为 app/build.gradle):
    implementation 'com.google.firebase:firebase-auth:19.1.0'
  4. 获取您项目的服务器密钥:
    1. 转到项目设置中的服务帐号页面。
    2. 点击“服务帐号”页面中 Firebase Admin SDK 部分底部的“生成新的私钥”。
    3. 新服务帐号的公钥/私钥对会自动保存到您的计算机上。请将此文件复制到您的身份验证服务器。

进行 Firebase 身份验证

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

    Java

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

    Kotlin

    private lateinit var auth: FirebaseAuth// ...
    // Initialize Firebase Auth
    auth = FirebaseAuth.getInstance()
  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

    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. 当用户登录您的应用时,请将其登录凭据(例如,其用户名和密码)发送到您的身份验证服务器。您的服务器会检查这些凭据,并在凭据有效的情况下返回一个自定义令牌
  4. 从身份验证服务器收到自定义令牌后,请将该令牌传递给 signInWithCustomToken 以完成该用户的登录:

    Java

    mAuth.signInWithCustomToken(mCustomToken)
            .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, "signInWithCustomToken:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCustomToken:failure", task.getException());
                        Toast.makeText(CustomAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

    Kotlin

    customToken?.let {
        auth.signInWithCustomToken(it)
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCustomToken:success")
                        val user = auth.currentUser
                        updateUI(user)
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCustomToken:failure", task.exception)
                        Toast.makeText(baseContext, "Authentication failed.",
                                Toast.LENGTH_SHORT).show()
                        updateUI(null)
                    }
                }
    }
    如果登录成功,AuthStateListener 可以使用 getCurrentUser 方法来获取用户的帐号数据。

后续步骤

在用户首次登录后,系统会创建一个新的用户帐号,并将其与该用户登录时使用的凭据(即用户名和密码、电话号码或者身份验证提供方信息)相关联。此新帐号存储在您的 Firebase 项目中,无论用户采用何种方式登录,您项目中的每个应用都可以使用此帐号来识别用户。

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

  • 在您的 Firebase 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。

您可以通过将身份验证提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证提供方登录您的应用。

如需让用户退出登录,请调用 signOut

Java

FirebaseAuth.getInstance().signOut();

Kotlin

FirebaseAuth.getInstance().signOut()