Google Play认证成功后Firebase返回null账户问题排查
问题解决思路与修正代码
核心问题分析
- Google Play游戏登录默认不返回用户基本信息:使用
DEFAULT_GAMES_SIGN_IN时,Google仅授予游戏服务相关权限,不会主动返回id、displayName等用户资料字段,需要显式声明请求。 - 未完成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
相关产品推荐
相关产品推荐

