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

Google Play认证成功后Firebase返回null账户问题排查

问题解决思路与修正代码

核心问题分析

  1. Google Play游戏登录默认不返回用户基本信息:使用DEFAULT_GAMES_SIGN_IN时,Google仅授予游戏服务相关权限,不会主动返回id、displayName等用户资料字段,需要显式声明请求。
  2. 未完成Firebase Auth关联流程:silentSignIn成功仅完成Google侧的登录,并未将该账户同步到Firebase Auth,因此Firebase.auth.currentUser始终为null。

具体修复步骤

  • 修改GoogleSignInOptions配置:添加requestProfile()获取用户基本信息,同时配置正确的Firebase客户端ID以生成用于Firebase认证的ID Token。
  • 触发Firebase Auth认证流程:在silentSignIn成功后,用返回的GoogleSignInAccount获取ID Token,调用Firebase Auth的signInWithCredential完成登录。
  • 检查后台配置:确保Google Cloud控制台中,游戏服务的OAuth客户端ID已关联到Firebase项目,且SHA-1指纹配置正确。

修正后的代码

class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化Firebase(若未在Application类中全局初始化)
        FirebaseApp.initializeApp(this)

        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestProfile() // 显式请求用户基本资料
            .requestIdToken("你的Firebase项目Web客户端ID") // 从Firebase控制台获取
            .build()
        val signInClient = GoogleSignIn.getClient(this, gso)

        // 先检查本地已有登录状态
        val lastSignedInAccount = GoogleSignIn.getLastSignedInAccount(this)
        if (lastSignedInAccount != null) {
            firebaseAuthWithGoogle(lastSignedInAccount)
        } else {
            signInClient.silentSignIn().addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    val account = task.result
                    // 将Google账户同步到Firebase Auth
                    firebaseAuthWithGoogle(account)
                    // 此时可正常获取用户字段
                    account.displayName // 不再为null
                    account.id // 不再为null
                } else {
                    // 静默登录失败,启动显式登录流程
                    startActivityForResult(signInClient.signInIntent, RC_SIGN_IN)
                }
            }
        }
    }

    private fun firebaseAuthWithGoogle(account: GoogleSignInAccount) {
        val credential = GoogleAuthProvider.getCredential(account.idToken, null)
        Firebase.auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { authTask ->
                if (authTask.isSuccessful) {
                    val currentUser = Firebase.auth.currentUser
                    // 此时currentUser不为null,可执行后续业务逻辑
                } else {
                    // 处理Firebase认证失败场景
                }
            }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.getResult(ApiException::class.java)
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
                // 处理登录异常
            }
        }
    }

    companion object {
        private const val RC_SIGN_IN = 1001
    }
}

额外注意事项

  • Firebase Web客户端ID获取路径:Firebase控制台 → 项目设置 → 常规 → 已添加的应用 → 查看"Web客户端ID"。
  • 需确保Google Play开发者控制台的游戏服务已关联目标Firebase项目,且SHA-1指纹同时配置在Firebase和Google Play控制台中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:05:28