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

Android Firebase自定义令牌登录时AuthResult.credential返回null问题

Firebase匿名用户转自定义令牌认证时credential为null的问题

我在应用中先使用Firebase匿名用户进行初始认证,当用户想要永久注册时,使用自定义令牌认证并将之前的匿名用户账号与自定义令牌账号关联。以下是我的代码:

val auth = Firebase.auth
auth.currentUser?.let { currentAnonymousUser ->
    Log.d("CURRENT ANONYMOUS USER ID ${currentAnonymousUser.uid}")
    auth.signInWithCustomToken(customToken).addOnSuccessListener {
        try {
            val customTokenLoginCredential = it.credential
            Log.d("USER LOGIN WITH CUSTOM TOKEN SUCCESS")
            currentAnonymousUser.linkWithCredential(customTokenLoginCredential)
                .addOnCompleteListener { task ->
                    Log.d("ANONYMOUS USER CONVERSION RESULT ${task.isSuccessful}")
                    if (task.isSuccessful) {
                        // redirect user to registration
                    }
                }
        } catch (ex: Exception) {
            showLog("CREDENTIAL CATCH EXCEPTION ${ex.localizedMessage}")
        }
    }.addOnFailureListener {
        showLog("USER LOGIN WITH CUSTOM TOKEN FAILURE")
    }
}

我已按照Firebase自定义认证文档操作,登录成功但it.credential返回null,导致登录流程中断。请问我遗漏了什么?或者有没有其他方法获取自定义令牌登录成功后的credential?


问题原因与解决办法

signInWithCustomToken成功返回的AuthResult里的credential字段本身就是null,因为自定义令牌登录流程不会生成可用于关联的Credential对象。正确的做法是直接用自定义令牌创建CustomCredential,然后用当前匿名用户调用linkWithCredential,不需要先登录自定义令牌账号。

修正后的代码如下:

val auth = Firebase.auth
auth.currentUser?.let { currentAnonymousUser ->
    Log.d("CURRENT ANONYMOUS USER ID ${currentAnonymousUser.uid}")
    // 用自定义令牌创建CustomCredential
    val customCredential = FirebaseAuth.getInstance().getCustomTokenCredential(customToken)
    // 直接用匿名用户关联这个credential
    currentAnonymousUser.linkWithCredential(customCredential)
        .addOnCompleteListener { task ->
            Log.d("ANONYMOUS USER CONVERSION RESULT ${task.isSuccessful}")
            if (task.isSuccessful) {
                // 关联成功,处理跳转逻辑
                val mergedUser = task.result?.user
                // mergedUser就是关联后的用户账号
            } else {
                // 关联失败,处理错误
                showLog("LINK FAILURE ${task.exception?.localizedMessage}")
            }
        }
}

这样就跳过了不必要的自定义令牌登录步骤,直接完成匿名账号与自定义令牌账号的关联,避免了credential为null的问题。

内容的提问来源于stack exchange,提问作者theAndDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:15:04