Android集成Firebase Auth实现Google登录失败求助
解决Firebase Auth Google登录返回DEVELOPER_ERROR问题
场景:通过Android Studio「Generate Signed Bundle」生成密钥库,用keytool获取SHA1/SHA256,应用未上架Google Play,集成Firebase Auth实现Google登录时,Logcat返回Status{statusCode=DEVELOPER_ERROR, resolution=null},尝试旧版startActivityForResult、添加Web Server ID等方法未解决。
以下是核心排查和修复步骤:
1. 验证SHA1指纹配置一致性
- 区分调试/发布指纹:调试版和发布版签名密钥库的SHA1是不同的,若当前运行的是调试包,必须将调试密钥库的SHA1也添加到Firebase控制台(不要只加发布版指纹)。
- 获取调试SHA1命令:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android - 获取发布版SHA1命令:
keytool -list -v -keystore 你的密钥库文件路径 -alias 密钥别名
- 获取调试SHA1命令:
- 同步google-services.json:检查Firebase控制台中配置的SHA1,与
google-services.json里oauth_client下certificate_hash的值是否完全一致,不一致则重新下载google-services.json替换到项目app目录。
2. 修正GoogleSignInOptions配置
集成Firebase Auth时,必须在GoogleSignInOptions中添加requestIdToken,且传入的是Web应用类型的Client ID(对应google-services.json中client_type:3的client_id,而非Android客户端ID),示例:
val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("169480533010-f4..f0.apps.googleusercontent.com") // 替换为你的Web Client ID .requestEmail() .build()
3. 调整Firebase初始化顺序与回调逻辑
- 初始化顺序:必须先初始化Firebase,再创建
GoogleSignInClient,修正代码顺序:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 先初始化Firebase FirebaseApp.initializeApp(this) firebaseAuth = FirebaseAuth.getInstance() // 再创建GoogleSignInClient val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("你的Web Client ID") .requestEmail() .build() googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions) // 按钮点击逻辑 val button = findViewById<Button>(R.id.btnLogin) button.setOnClickListener { resultLauncher.launch(googleSignInClient.signInIntent) } } - 完善回调逻辑:需将Google登录结果转换为Firebase凭证并完成认证,示例:
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val task = GoogleSignIn.getSignedInAccountFromIntent(result.data) try { val account = task.getResult(ApiException::class.java) // 获取Google认证凭证 val credential = GoogleAuthProvider.getCredential(account.idToken, null) // 关联Firebase Auth firebaseAuth.signInWithCredential(credential) .addOnCompleteListener(this) { authTask -> if (authTask.isSuccessful) { val user = firebaseAuth.currentUser println("登录成功:${user?.displayName}") } else { println("Firebase认证失败:${authTask.exception?.message}") } } } catch (e: ApiException) { println("Google登录失败,错误码:${e.statusCode}") } } }
4. 清理依赖与插件冗余配置
- 根目录
build.gradle移除冗余的google-services插件声明:buildscript { dependencies { classpath 'com.google.gms:google-services:4.3.15' } } plugins { id 'com.android.application' version '8.0.1' apply false id 'com.android.library' version '8.0.1' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false } app/build.gradle移除不必要的依赖:dependencies { implementation platform('androidx.compose:compose-bom:2022.10.00') implementation platform('com.google.firebase:firebase-bom:32.0.0') implementation 'com.google.firebase:firebase-auth' implementation 'com.google.android.gms:play-services-auth:20.5.0' androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00') }
5. 清理缓存并重建项目
- 执行
File -> Invalidate Caches... -> Invalidate and Restart清理Android Studio缓存 - 执行
Build -> Clean Project和Build -> Rebuild Project重新构建 - 卸载设备上的旧应用,重新安装运行
内容的提问来源于stack exchange,提问作者danilo
相关产品推荐
相关产品推荐

