Firebase Auth 是 Google 的云服务,用于在移动和 Web 应用中对用户进行身份验证,提供通过电子邮件、电话和社交网络的现成登录方法。SDK 管理完整的会话周期:注册、登录、令牌更新和退出。根据 Google, 2026,Firebase Auth 开箱即用地支持超过 10 个身份验证提供商。该服务免费提供,对已验证用户的数量没有限制。
要点
Firebase Auth 是 Google 的后端身份验证服务,作为 Firebase SDK 的一部分提供。它承担了所有账户管理的服务器逻辑:存储密码哈希、生成 JWT 令牌、处理 OAuth 2.0 和 OpenID Connect 流程。开发者无需部署自己的身份验证服务器、管理刷新令牌或实现验证协议 — 所有这些都由 Firebase 完成。
Firebase Auth 使用联邦架构,拥有统一的用户存储。每个用户获得一个唯一标识符(UID),该标识符独立于登录提供商。通过 Google 和电子邮件注册时,会创建一个用户,同时关联两个账户(providers)。Firebase 自动处理客户端端的账户关联(account linking),无需向服务器发送额外请求。
Firebase Auth 令牌是 JWT(JSON Web 令牌),其 payload 包含 UID、发布时间、过期时间和自定义声明。访问令牌有效期为 1 小时,刷新令牌 — 无限制(但可通过 Admin Console 撤销)。SDK 自动在每个 HTTP 请求到 Firebase 服务时刷新令牌。根据 Google(2026),Firebase Auth 每天服务超过 5 亿次身份验证。
Firebase Auth 在 Spark(免费)和 Blaze(按需付费)套餐中完全免费。唯一的限制是 Spark 套餐每天 1 万次匿名身份验证(Blaze 套餐取消此限制)。电子邮件/电话和 OAuth 身份验证没有限制。对于电话验证,Spark 每月提供 1 万次验证,Blaze — 按使用量付费(用完 1 万次后每次验证 $0.01)。这使得 Firebase Auth 成为市场上最经济的解决方案之一。
Firebase Auth 开箱即用地支持 12 个身份验证提供商。每个提供商都作为独立的身份服务实现,具有预定义的流程 — 开发人员只需创建 Credential 对象并将其传递给 signInWithCredential。Firebase 自动判断用户是新人还是已有用户,如果电子邮件重复,会建议关联账户。
电子邮件/密码 — 基本的身份验证方法,密码哈希(bcrypt)存储在 Firebase 服务器上。支持注册、登录、通过电子邮件重置密码和确认电子邮件。Firebase 自动检查密码复杂度(至少 6 个字符),并可在 N 次失败尝试后阻止登录(防范暴力破解)。
Google、Apple、Facebook、Twitter、Microsoft、Yahoo、GitHub — 所有 OAuth 2.0 提供商均可通过 Firebase 控制台在 5 分钟内完成配置。对于每个提供商,需要在其自己的控制台中获取 Client ID 和 Client Secret。Apple Sign In 对于 App Store 中的应用是强制性的(Apple 自 2020 年起的要求)。Firebase Auth 完全支持带有 JWT 验证的 Apple Sign In 流程。
| 提供商 | 协议 | 需要 Client Secret |
|---|---|---|
| OAuth 2.0 | 否 | |
| Apple | OAuth 2.0 + OpenID | 是 |
| OAuth 2.0 | 是 | |
| OAuth 1.0a | 是 | |
| GitHub | OAuth 2.0 | 是 |
Phone Auth — 通过发送到用户电话号码的 SMS 代码进行身份验证。Firebase 使用 Silent APN(iOS)或 SMS Retriever API(Android)自动读取代码,无需键盘输入。在 Android 上,SMS Retriever API 仅在具有 Google Play Services 的设备上运行。对于 SMS 不可用的地区,Firebase 支持 reCAPTCHA 验证作为后备方案。电话身份验证对于必须绑定号码的应用至关重要 — 送餐、出租车、银行业务。
连接 Firebase Auth 在 Android 上需要将 firebase-auth-ktx 依赖项添加到 build.gradle 并初始化 Firebase App(通过 Google Services 插件自动完成)。之后,FirebaseAuth 对象可通过静态方法 getInstance() 获取 — 整个应用程序的单例。无需额外配置。
// build.gradle(应用级别)
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-auth-ktx")
implementation("com.google.android.gms:play-services-auth:21.0.0")
}
createUserWithEmailAndPassword — 注册的主要方法。它接收电子邮件和密码,在 Firebase Auth 中创建用户,并返回包含 UID 的 AuthResult 对象。如果具有此电子邮件的用户已存在,Firebase 返回错误 ERROR_EMAIL_ALREADY_IN_USE。成功注册后,SDK 自动将令牌保存在 SharedPreferences 中,并在下次启动应用时恢复会话,无需调用 signIn。
class AuthViewModel {
private val auth = FirebaseAuth.getInstance()
suspend fun register(email: String, password: String): Result<User> {
return try {
val result = auth.createUserWithEmailAndPassword(email, password).await()
Result.success(result.user?.toUser() ?: throw Exception("User is null"))
} catch (e: FirebaseAuthException) {
Result.failure(e)
}
}
}
对于 Google Sign In,使用两步流程:通过 Credential Manager(Android)或 Google Sign-In SDK 获取 ID Token,然后将令牌传递给 Firebase credential。Firebase 在其自己的服务器上验证令牌(使用 Google 的 RSA 密钥检查签名),并创建或返回现有用户。该过程不需要在客户端存储密钥 — 整个身份验证通过令牌的加密验证完成。
Firebase Auth 自动管理会话的生命周期。登录后,SDK 将刷新令牌保存在本地存储中,并在每次应用重启时通过 signIn silently 恢复会话。开发者无需实现令牌存储、过期处理或刷新 — 所有这些都由 Firebase Auth SDK 完成。
FirebaseAuth.getInstance().currentUser 如果会话活动则返回 FirebaseUser 对象,如果用户已退出则返回 null。FirebaseUser 包含 UID、电子邮件、displayName、photoUrl、phoneNumber、providerData 和声明列表。更新个人资料后(updateProfile),更改会自动与服务器同步。FirebaseUser 对象缓存在内存中,并在任何 auth 操作时更新。
signInAnonymously — 创建无需注册的临时用户。匿名用户拥有 UID,但没有电子邮件、姓名或提供商。这对于注册前内容可用的应用(购物车、收藏夹、历史记录)非常有用。当用户决定注册时,匿名账户通过 linkWithCredential 与永久账户关联。Spark 套餐每天限制 1 万次匿名身份验证。
根据 Google(2026),约 40% 的用户匿名开始使用应用,其中 25% 随后将匿名账户与永久账户关联。这意味着匿名身份验证在用户转换为注册用户时不会丢失数据。
signOut() 方法清除本地会话并删除保存的令牌。调用 signOut 后,currentUser 变为 null。delete() 方法完全从 Firebase Auth 中删除用户账户 — 所有关联的提供商被断开,对 Firebase 服务的访问被阻止。删除用户是不可逆的,需要重新身份验证(reauthenticate)以防止未经授权的账户删除。
Custom Claims 是 Firebase Auth 添加到用户 JWT 令牌的自定义属性。与标准个人资料字段(电子邮件、displayName)不同,声明仅在服务器端可用 — 通过 Admin SDK 或通过 Firestore 和 Realtime Database 的 Firebase Security Rules 规则。声明对客户端不直接可见,但可通过 user.getIdTokenResult() 读取。
角色和访问权限 — 声明最常见的应用场景。Admin SDK 允许通过服务器上的映射分配“admin”、“moderator”或“premium_user”角色。这些声明自动进入令牌,并可在 Firestore Security Rules 中用于区分访问权限。根据 Google(2026),65% 的 Firebase 项目使用自定义声明来管理数据访问,而不是使用单独的角色服务器。
// Admin SDK (Node.js) — 为用户分配声明
const admin = require("firebase-admin")
await admin.auth().setCustomUserClaims(uid, {
role: "premium",
tier: "pro",
maxProjects: 50
})
// 在客户端读取声明
val claims = FirebaseAuth.getInstance()
.currentUser?.getIdTokenResult(true)
?.await()?.claims
Custom claims 有限制:每个用户整个 JSON 声明对象最多 1000 字节,对象中不超过 20 个键。声明不用于存储动态数据 — 仅通过 Admin SDK 更新,且不实时同步。声明更新后,用户必须刷新令牌(getIdTokenResult(true))或重新登录应用。声明在客户端不被缓存 — 每次新登录都从服务器获取当前令牌。
Firebase Auth 实现多层账户保护:流量加密(TLS 1.3)、密码哈希(bcrypt,成本 10)、通过 Adaptive Pricing 防范暴力破解(可疑活动时自动减慢响应)以及与 reCAPTCHA 集成用于 Web 登录。此外,Firebase Auth 在可疑活动时禁用账户 — 来自不同 IP 的批量登录、使用错误密码的登录尝试和可疑电子邮件地址。
Account Lockout — 在特定次数登录失败后自动锁定账户。阈值可在 Firebase 控制台中配置(默认为 10 次尝试)。Email Enumeration Protection — 防范电子邮件地址枚举。启用后,Firebase 对存在和不存在的电子邮件返回相同的错误。Trusted Domains — 将登录限制为仅具有设置中指定的电子邮件域的用户。
额外的自定义身份验证可以建立在 Custom Tokens 上 — 使用 Firebase 服务账户签名的 JWT。客户端将自定义令牌传递给 signInWithCustomToken(),Firebase 验证签名并创建会话。这允许将 Firebase Auth 与现有服务器身份验证(例如,自己的服务器的 OAuth 2.0)集成,而无需复制用户数据库。令牌有效期为 1 小时,之后 SDK 通过 Firebase 刷新令牌自动续期会话。
常见问题
Firebase Auth 在 Spark 和 Blaze 套餐中对所有提供商完全免费。限制:每天 1 万次匿名注册(Spark)和每月 1 万次 SMS 验证(Spark)。
使用 linkWithCredential — 将新提供商关联到当前匿名或电子邮件用户的方法。用户通过 Google 登录,然后通过 linkWithCredential 关联电子邮件。
Firebase Auth 需要互联网进行登录,但会在本地缓存会话。登录后,应用在离线模式下工作,直到需要刷新令牌(每小时一次)。
在 Firebase 控制台中,转到 Authentication 部分,找到用户并单击“Revoke Tokens”。用户的所有活动会话将在 30 分钟内失效。
通过控制台或 Admin SDK 删除账户会立即阻止对所有 Firebase 服务的访问。令牌停止工作。Firestore、Realtime Database 和 Storage 中的数据不会自动删除。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。