SHA1关联旧GCP项目时Firebase Auth配置报错解决方案咨询
我之前也遇到过类似的包名+SHA1被旧GCP项目占用导致Firebase Auth配置卡壳的问题,折腾了好一阵才搞定,结合你的情况,给你梳理下可行的解决方案:
核心问题分析
你的两个尝试踩了两个常见坑:
- 白名单操作后报错:大概率是你添加的是Android客户端ID,但Firebase Auth验证Google登录的ID Token需要的是Web客户端ID,所以白名单加错了对象。
- AuthUI客户端ID冲突:AuthUI默认会自动使用Firebase项目生成的Web客户端ID,当你手动传入旧项目的
GoogleSignInOptions时,相当于同时提供了两个不同的客户端ID,直接触发冲突报错。
解决方案步骤
步骤1:获取旧GCP项目的正确客户端ID
登录旧GCP项目的API控制台,进入凭据页面:
- 确认对应你Android应用的Android客户端ID存在(包名+SHA1匹配的那个,这个是已经关联好的,不用动)。
- 如果还没有Web客户端ID,点击创建凭据 -> OAuth客户端ID -> 选择Web应用,创建一个新的Web客户端ID,把这个ID记下来(后面代码和Firebase配置都要用)。
步骤2:让Firebase信任旧项目的Web客户端ID
打开你的Firebase新项目控制台,进入Authentication -> 登录方法 -> Google:
- 确保Google登录已启用。
- 向下滚动到授权的客户端ID部分,点击添加,输入你刚才从旧GCP项目获取的Web客户端ID,保存配置。
步骤3:修改代码,绕过AuthUI的默认配置
既然AuthUI会导致客户端ID冲突,我们直接用原生Google Sign-In集成,再将登录凭证传给Firebase Auth,具体代码如下:
- 初始化核心对象:
private FirebaseAuth mAuth; private GoogleSignInClient mGoogleSignInClient; private static final int RC_SIGN_IN = 9001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // 初始化Firebase Auth mAuth = FirebaseAuth.getInstance(); // 用旧GCP项目的Web客户端ID配置Google登录 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("你的旧GCP项目Web客户端ID.apps.googleusercontent.com") .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso); // 绑定登录按钮点击事件 findViewById(R.id.btn_google_login).setOnClickListener(v -> startGoogleSignIn()); }
- 启动Google登录Intent:
private void startGoogleSignIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); }
- 处理登录结果并传给Firebase:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { // 获取Google登录成功后的账户信息 GoogleSignInAccount account = task.getResult(ApiException.class); assert account != null; // 将Google的ID Token传给Firebase完成认证 authenticateWithFirebase(account.getIdToken()); } catch (ApiException e) { Log.w("LoginError", "Google登录失败", e); // 这里可以添加登录失败的UI提示 } } } private void authenticateWithFirebase(String idToken) { AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, task -> { if (task.isSuccessful()) { // Firebase认证成功,获取用户信息 FirebaseUser user = mAuth.getCurrentUser(); // 跳转到主页面或更新UI } else { Log.w("FirebaseError", "Firebase认证失败", task.getException()); // 提示用户认证失败 } }); }
额外注意事项
- 确保旧GCP项目的OAuth同意屏幕已经将你的应用域名(如果是Web端)或包名(Android端)添加到授权范围里,避免出现OAuth权限错误。
- 如果你的应用还需要其他登录方式(比如邮箱),可以继续用AuthUI集成,只把Google登录换成上述原生方式即可,两者不会冲突。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

