在 Android Studio 中,Logcat 中出现以下 Kotlin 错误:
[RequestTokenManager] getToken() -> BAD_AUTHENTICATION。应用程序:com.example.packagename,服务:oauth2:openidamnk:长期凭证不可用。
当我单击应用程序中的“使用 Google 登录”按钮时,我从异常的 catch 语句中收到此错误:没有可用的凭据。
我已经看了几个小时了,但无法弄清楚。这不是重复的,因为其他答案已经存在超过 3 年了,没有任何解决方案对我有用。
这是我的代码:
fun sighInWithGoogle(
context: Context,
auth: FirebaseAuth
) {
val rawNonce = UUID.randomUUID().toString()
val bytes = rawNonce.toByteArray()
val md = MessageDigest.getInstance("SHA-256")
val digest = md.digest(bytes)
val hashedNonce = digest.fold("") { str, it ->
str + "%02x".format(it)
}
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()
val googleSignRequest: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
val credentialManager = CredentialManager.create(context)
CoroutineScope(Dispatchers.IO).launch {
try {
val result = credentialManager.getCredential(
request = googleSignRequest,
context = context,
)
handleGoogleSignIn(context, auth, result)
} catch (e: GetCredentialException) {
handleGoogleSignInFailure(context, e)
}
}
}
private fun handleGoogleSignInFailure(context: Context, e: Exception) {
Log.e("TAG", "Unexpected error: ${e.message.toString()}")
postToastMessage("Google Login Failed: ${e.message.toString()}")
}
我通过将 setFilterByAuthorizedAccounts 设置为 false 而不是 true 来修复它。当它为 true 时,它会检查用户已经登录到您的应用程序的任何帐户。如果用户之前从未使用任何 Google 帐户登录过,那么它应该是错误的。
val googleIdOption: GetGoogleIdOption =
GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(context.getString(R.string.web_client_id))
.setAutoSelectEnabled(true)
.setNonce(hashedNonce)
.build()