Android Firebase预构建UI登录:邮箱链接认证问题
Firebase预构建UI邮箱链接认证:保存邮箱的正确姿势
- 核心思路是利用Firebase预构建UI提供的邮件发送前回调,在邮件发出前拦截并保存用户输入的邮箱地址,具体步骤如下:
- 配置Email登录提供者时添加回调
在初始化预构建UI的登录Intent时,给Email配置器设置setSendEmailVerificationCallback,这个回调会在用户输入邮箱并触发发送链接操作后、邮件实际发送前执行,刚好能拿到邮箱地址:
val emailConfig = AuthUI.IdpConfig.EmailBuilder() .setSendEmailVerificationCallback(object : AuthUI.EmailSignInCallback { override fun onSendEmailVerification( email: String, actionCodeSettings: ActionCodeSettings, continuation: AuthUI.EmailSignInContinuation ) { // 把邮箱存到SharedPreferences(也可以用DataStore/本地数据库) val prefs = getSharedPreferences("FirebaseAuth", Context.MODE_PRIVATE) prefs.edit().putString("pending_email", email).apply() // 必须调用continueTask()才能继续发送邮件流程 continuation.continueTask() } }) .build() // 构建登录Intent并启动 val signInIntent = AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(listOf(emailConfig)) .build() startActivityForResult(signInIntent, RC_SIGN_IN)
- 处理邮箱链接时取出保存的邮箱
在接收链接的Activity(比如你的MainActivity)里,先从存储中取出之前保存的邮箱,再调用signInWithEmailLink:
// 获取Intent中的邮箱链接 val emailLink = intent.data?.toString() ?: return // 取出保存的邮箱 val prefs = getSharedPreferences("FirebaseAuth", Context.MODE_PRIVATE) val savedEmail = prefs.getString("pending_email", null) ?: run { // 如果没取到邮箱,这里可以引导用户重新输入,或者提示错误 Toast.makeText(this, "未找到关联邮箱,请重新发起登录", Toast.LENGTH_SHORT).show() return@run } // 执行登录 FirebaseAuth.getInstance().signInWithEmailLink(savedEmail, emailLink) .addOnCompleteListener { task -> if (task.isSuccessful) { // 登录成功,可清除存储的邮箱(可选) prefs.edit().remove("pending_email").apply() // 后续逻辑 } else { // 登录失败处理 Toast.makeText(this, "登录失败:${task.exception?.message}", Toast.LENGTH_SHORT).show() } }
- 注意点:
- 必须调用
continuation.continueTask(),否则邮件不会发送,登录流程会卡住 - 存储邮箱的方式按需选择,SharedPreferences适合简单场景,敏感场景可以考虑加密存储
- 登录成功后建议清除存储的邮箱,避免残留数据
- 必须调用
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

