Android中Firebase Google登录多次尝试后失效的问题求助
我在用Firebase的Google SignIn认证功能,一开始运行正常,但几次登录尝试后就失败了。想问问怎么在Debug模式下测试Google认证?我已经添加了AndroidDebug SHA密钥,但问题还是没解决。
出现的错误日志:
[BeginSignInOperation] BeginSignInOperation failed. [CONTEXT service_id=212 ] czxt: asco at asgj.apply(:com.google.android.gms@232316037@23.23.16 (150400-540660214):5) at cztd.d(:com.google.android.gms@232316037@23.23.16 (150400-540660214):2) at czte.run(:com.google.android.gms@232316037@23.23.16 (150400-540660214):10) at acav.c(:com.google.android.gms@232316037@23.23.16 (150400-540660214):6) at acav.run(:com.google.android.gms@232316037@23.23.16 (150400-540660214):7) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at acgd.run(:com.google.android.gms@232316037@23.23.16 (150400-540660214):0) at java.lang.Thread.run(Thread.java:923) Caused by: asco at ascn.a(:com.google.android.gms@232316037@23.23.16 (150400-540660214):0) at asco.d(:com.google.android.gms@232316037@23.23.16 (150400-540660214):0) at mnv.a(:com.google.android.gms@232316037@23.23.16 (150400-540660214):85) at asgh.a(:com.google.android.gms@232316037@23.23.16 (150400-540660214):0) at cztw.d(:com.google.android.gms@232316037@23.23.16 (150400-540660214):2) at czty.run(:com.google.android.gms@232316037@23.23.16 (150400-540660214):9)
使用的依赖:
- Google Play服务认证:
com.google.android.gms:play-services-auth:20.5.0
- Firebase认证:
com.google.firebase:firebase-auth-ktx:21.0.3
SignIn和SignUp请求对象的代码:
@Provides @Named(SIGN_IN_REQUEST) fun provideSignInRequest( app: Application ) = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) .setServerClientId(app.getString(R.string.default_web_client_id)) .setFilterByAuthorizedAccounts(false) .build() ) .setAutoSelectEnabled(false) .build() @Provides @Named(SIGN_UP_REQUEST) fun provideSignUpRequest( app: Application ) = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) .setServerClientId(app.getString(R.string.default_web_client_id)) .setFilterByAuthorizedAccounts(false) .build() ) .build()
仓库中调用登录的代码:
override suspend fun oneTapSignInWithGoogle(): OneTapSignInResponse { return try { val signInResult = oneTapClient.beginSignIn(signInRequest).await() Response.Success(signInResult) } catch (e: Exception) { try { val signUpResult = oneTapClient.beginSignIn(signUpRequest).await() Response.Success(signUpResult) } catch (e: Exception) { Response.Failure(e) } } }
排查方案
1. 验证Debug SHA-1密钥配置
重新生成并核对Debug SHA-1:在Android Studio右侧Gradle面板找到Tasks > android > signingReport,运行后复制Debug栏的SHA-1,到Firebase控制台对应项目的应用设置里粘贴,确保无多余字符,保存后等待5-10分钟让配置生效。
2. 检查Web客户端ID正确性
确认R.string.default_web_client_id对应的是Firebase控制台里的Web应用客户端ID(不是Android应用的),如果有误,替换strings.xml里的值。
3. 清理缓存与重装应用
清除应用缓存和数据,卸载后重装Debug版本;同时清除Google Play服务的缓存,避免旧会话干扰。
4. 增强Debug日志调试
修改仓库代码,捕获异常的具体信息,替代模糊的错误提示:
override suspend fun oneTapSignInWithGoogle(): OneTapSignInResponse { return try { val signInResult = oneTapClient.beginSignIn(signInRequest).await() Response.Success(signInResult) } catch (e: Exception) { Log.e("GoogleSignIn", "Sign in failed: ${e.message}", e) try { val signUpResult = oneTapClient.beginSignIn(signUpRequest).await() Response.Success(signUpResult) } catch (e: Exception) { Log.e("GoogleSignIn", "Sign up failed: ${e.message}", e) Response.Failure(e) } } }
5. 统一依赖版本
你当前使用的play-services-auth和firebase-auth-ktx版本差距较大,建议升级到兼容的最新版本,比如:
com.google.android.gms:play-services-auth:20.7.0 com.google.firebase:firebase-auth-ktx:22.3.1
6. 优化OneTap认证逻辑
当前代码在signIn失败后直接尝试signUp,但两者请求配置几乎一致,可先单独测试signIn请求;另外,setFilterByAuthorizedAccounts(false)会显示所有Google账号,若改为true只显示已授权账号,可能解决异常。
内容的提问来源于stack exchange,提问作者iamkdblue

