调用GoogleAuthProvider获取凭证时触发Firebase内部错误[Bad Request]
我来帮你排查这个在调用GoogleAuthProvider.getCredential时抛出的Firebase异常——这个问题我之前帮不少开发者定位过,大概率是配置或token有效性的问题,下面是几个核心排查方向:
检查Google OAuth客户端ID的一致性
确保Firebase控制台「Authentication」→「登录方法」→「Google」里配置的Android客户端ID,和你项目中google-services.json文件里的oauth_client[].client_id完全一致。另外还要确认Google Cloud Console中对应项目的这个客户端ID已经启用了Google Identity API,没有被禁用或限制。验证ID Token的有效性
在调用认证方法前,先确认acct.getIdToken()返回的token不为空且格式正确。你可以通过Google官方的token验证方式(比如本地代码校验签名或在线工具,注意不要泄露真实业务token)检查token是否过期、签名是否合法。另外要确保Google Sign-In流程是完整完成的,没有出现用户中途取消授权的情况。检查API密钥的应用限制
登录Google Cloud Console的「API和服务」→「凭据」页面,找到Firebase项目对应的API密钥,查看是否设置了过严的应用限制(比如包名、签名指纹配置错误)。如果限制规则和你的应用不匹配,就会触发Bad Request错误。可以临时取消限制来测试,确认问题后再重新配置正确的规则。排查依赖版本兼容性
确保项目中Firebase Auth和Google Play Services相关依赖的版本保持兼容,尽量使用同一大版本的依赖包,避免版本冲突导致的底层调用异常。比如com.google.firebase:firebase-auth和com.google.android.gms:play-services-auth的版本要尽量匹配。
优化后的代码示例(增加前置校验)
// 从Google Sign-In回调中获取账号信息 GoogleSignInAccount acct = result.getSignInAccount(); if (acct != null) { String idToken = acct.getIdToken(); if (idToken != null && !idToken.isEmpty()) { final AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); // 执行Firebase认证 firebaseAuth.signInWithCredential(credential) .addOnCompleteListener(this, task -> { if (task.isSuccessful()) { // 认证成功逻辑 Log.d("FirebaseAuth", "Sign in success"); } else { // 打印详细错误信息便于排查 Log.e("FirebaseAuth", "Sign in failed", task.getException()); } }); } else { Log.e("GoogleSignIn", "获取到的ID Token为空"); } } else { Log.e("GoogleSignIn", "GoogleSignInAccount对象为空"); }
内容的提问来源于stack exchange,提问作者Matej Špilár

