0Pricing
Android Academy · 课时

Firebase 身份验证

使用电子邮件和 Google 登录

Firebase 身份验证 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

为什么使用 Firebase Auth

Firebase Authentication 负责处理用户登录中的复杂部分:安全存储密码、刷新令牌、恢复账户,以及接入多种提供商(电子邮件、Google、Apple、手机和匿名登录)。

您无需构建登录服务器,只需调用几个 API,就能获得经过验证的 FirebaseUser。在本课中,您将实现电子邮件/密码登录和 Google 登录。

启用登录方式

编写代码前,请在 Firebase 控制台中启用所需的身份验证提供商:

  • 进入身份验证 → 登录方式。
  • 开启电子邮件/密码。
  • 开启 Google(选择一个支持电子邮件地址)。

使用 Google 登录时,还必须在项目设置中添加应用的 SHA-1 指纹,否则登录会因开发者错误而失败。

获取 FirebaseAuth 实例

入口是 Firebase.auth。它提供当前用户,以及创建账户、登录和退出登录的方法。

没有用户登录时,auth.currentUser 为 null——您可以据此快速决定应用启动时显示哪个界面。

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

val auth = Firebase.auth

fun isLoggedIn(): Boolean {
    return auth.currentUser != null
}

创建账户

使用 createUserWithEmailAndPassword 注册新用户。它会返回一个任务,但在协程代码中,您可以使用 await()(来自 kotlinx-coroutines-play-services)等待它完成。

成功后,用户会立即登录。

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun register(email: String, password: String): Result<Unit> {
    return try {
        Firebase.auth
            .createUserWithEmailAndPassword(email, password)
            .await()
        Result.success(Unit)
    } catch (e: Exception) {
        Result.failure(e)
    }
}

使用电子邮件登录

让现有用户登录需要使用 signInWithEmailAndPassword。其结构与注册过程类似。

将调用包装在 try/catch 中,您就可以显示清晰的错误信息 — 密码错误、用户不存在或电子邮件格式不正确。

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.auth.FirebaseUser
import kotlinx.coroutines.tasks.await

suspend fun login(email: String, password: String): FirebaseUser? {
    val result = Firebase.auth
        .signInWithEmailAndPassword(email, password)
        .await()
    return result.user
}

使用 Compose 构建登录界面

将身份验证接入一个小型 Compose 界面。将电子邮件和密码保存在状态中,从协程作用域调用挂起函数,并显示错误信息。

@Composable
fun LoginScreen(onLoggedIn: () -> Unit) {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var error by remember { mutableStateOf<String?>(null) }
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        TextField(email, { email = it }, label = { Text("Email") })
        TextField(password, { password = it }, label = { Text("Password") })
        error?.let { Text(it, color = Color.Red) }
        Button(onClick = {
            scope.launch {
                val user = login(email, password)
                if (user != null) onLoggedIn() else error = "Login failed"
            }
        }) { Text("Sign in") }
    }
}

读取当前用户

FirebaseUser 包含身份详细信息:uid(稳定且唯一的 ID)、email、displayName 和 photoUrl。

将该用户的数据存储到 Firestore 时,请使用 uid 作为键 — 它保证唯一且不会改变。

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun describeUser() {
    val user = Firebase.auth.currentUser ?: return
    println("UID: ${user.uid}")
    println("Email: ${user.email}")
    println("Name: ${user.displayName ?: "(none)"}")
}

监听身份验证状态

身份验证状态可能随时发生变化(登录、退出登录、令牌刷新)。请注册一个 AuthStateListener 来响应变化,而不是不断轮询。

这样就可以在登录界面和主页之间自动导航,非常适合此场景。

import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.auth

val listener = FirebaseAuth.AuthStateListener { auth ->
    val user = auth.currentUser
    if (user == null) {
        println("Signed out -> show login")
    } else {
        println("Signed in as ${user.email}")
    }
}

// Attach and detach with lifecycle
Firebase.auth.addAuthStateListener(listener)
// Firebase.auth.removeAuthStateListener(listener)

使用 Credential Manager 进行 Google 登录

进行 Google 登录的现代方式是使用 凭据管理器 API。您需要请求 Google ID 令牌,然后将其交换为 Firebase 凭据。

关键步骤是根据返回的 ID 令牌构建 GoogleAuthProvider 凭据,并将其传递给 signInWithCredential。

import com.google.firebase.Firebase
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun firebaseSignInWithGoogle(idToken: String) {
    // idToken comes from Credential Manager / Google Identity
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    Firebase.auth.signInWithCredential(credential).await()
}

退出登录

退出登录只需调用一次:auth.signOut()。它会清除本地用户信息,并触发您的身份验证状态监听器。

对于 Google 登录,您还可以清除凭据管理器状态,以便下次再次显示选择器。退出登录后,currentUser 会变为 null。

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun logout() {
    Firebase.auth.signOut()
    // currentUser is now null; your AuthStateListener fires
}

处理身份验证错误

身份验证失败时会抛出带有具体类型的异常,您可以据此进行分支处理:

  • FirebaseAuthInvalidUserException — 用户不存在或已被停用。
  • FirebaseAuthInvalidCredentialsException — 密码错误或电子邮件地址无效。
  • FirebaseAuthUserCollisionException — 该电子邮件已注册。

请将这些异常映射为易于理解的消息,而不是直接显示原始堆栈跟踪。

import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthUserCollisionException

fun messageFor(e: Throwable): String = when (e) {
    is FirebaseAuthInvalidCredentialsException -> "Wrong email or password"
    is FirebaseAuthUserCollisionException -> "That email is already in use"
    else -> "Something went wrong, try again"
}

快速检查

您希望在用户登录或退出登录时,自动在登录界面和主页之间切换。最简洁的做法是什么?

回顾:身份验证

现在,您已经可以使用 Firebase 对用户进行身份验证:

  • 在控制台中启用身份验证提供商;为 Google 添加您的 SHA-1。
  • 使用 Firebase.auth 与 createUserWithEmailAndPassword / signInWithEmailAndPassword。
  • 使用 Google 登录:获取 ID 令牌,构建 GoogleAuthProvider 凭据,然后调用 signInWithCredential。
  • 通过 currentUser 读取身份信息(使用 uid 作为数据键)。
  • 使用 AuthStateListener 响应状态变化;使用 signOut() 退出登录。

下一步:将该用户的数据存储到 Cloud Firestore 中。

常见问题解答

「Firebase 身份验证」课时是免费的吗?

是的 — 「Firebase 身份验证」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「Firebase 身份验证」这节课中我会学到什么?

使用电子邮件和 Google 登录 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「Firebase 身份验证」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 设置 Firebase
  2. Firebase 身份验证
  3. Cloud Firestore 基础
  4. 使用 Cloud Messaging 推送
← 返回 Android Academy