You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Firebase预构建UI登录:邮箱链接认证问题

Firebase预构建UI邮箱链接认证:保存邮箱的正确姿势
  • 核心思路是利用Firebase预构建UI提供的邮件发送前回调,在邮件发出前拦截并保存用户输入的邮箱地址,具体步骤如下:
  1. 配置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)
  1. 处理邮箱链接时取出保存的邮箱
    在接收链接的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:46:05