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

SHA1关联旧GCP项目时Firebase Auth配置报错解决方案咨询

我之前也遇到过类似的包名+SHA1被旧GCP项目占用导致Firebase Auth配置卡壳的问题,折腾了好一阵才搞定,结合你的情况,给你梳理下可行的解决方案:

核心问题分析

你的两个尝试踩了两个常见坑:

  1. 白名单操作后报错:大概率是你添加的是Android客户端ID,但Firebase Auth验证Google登录的ID Token需要的是Web客户端ID,所以白名单加错了对象。
  2. 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,具体代码如下:

  1. 初始化核心对象:
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());
}
  1. 启动Google登录Intent:
private void startGoogleSignIn() {
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_SIGN_IN);
}
  1. 处理登录结果并传给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:31:00