RequestTokenManager getToken() -> BAD_AUTHENTICATION

问题描述 投票:0回答:1

在 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()}")
    }
firebase kotlin authentication google-signin
1个回答
0
投票

我通过将 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()
© www.soinside.com 2019 - 2024. All rights reserved.