Google OneTap 登录密码或错误代码:10 / 16

问题描述

我正在尝试为我开发的应用程序设置一个 Google OneTap 登录按钮(我没有使用 Firebase 登录),参考此来源: https://developers.google.com/identity/one-tap/android/get-started

我已在 Cloud Console 上创建了 OAuth 和 Web 凭据。为了生成 OAuth Id,我采用了 Android Studio登录报告中提供的 SHA1(我采用了开发 SHA-1,但无论如何它们都是一样的)。

我已将来自 WebAuth 的客户端 ID(不是来自 OAuth 的 Android id添加R.string.default_web_client_id

当我使用 Firebase RTDB 存储一些数据时,我也在那里设置了这个 SHA-1。 Manifest、Cloud Console 和 Firebase Console 中的项目名称相同。我从 Firebase 下载了“google-services.json”并将其放在应用程序根目录中。在 Firebase 上,我还设置了有效的服务电子邮件

这是我在登录活动中实现 OneTap 的方式:

class LoginActivity : AppCompatActivity() {
  ...
  private lateinit var oneTapClient: SignInClient
  private lateinit var signUpRequest: BeginSignInRequest
  ...

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
                .setSupported(false)
                .build())
            .setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                .setSupported(true)
                // Your server's client ID,not your Android client ID.
                .setServerClientId(getString(R.string.default_web_client_id))
                // Only show accounts prevIoUsly used to sign in.
                .setFilterByAuthorizedAccounts(false)
                .build())
            // Automatically sign in when exactly one credential is retrieved.
            .setAutoSelectEnabled(false)
            .build()
    }

  // THIS CALLED FROM FRAGMENT WHEN GOOGLE BUTTON IS CLICKED
  fun onGoogleClick() {
        when (GoogleApiAvailability().isGooglePlayServicesAvailable(applicationContext)) {
            0 -> {
                beginGoogleSignIn()
            }
            1 -> {
                toaster.show("Google services required")
            }
            2 -> {
                toaster.show("Google services update required")
            }
        }
    }

  private fun beginGoogleSignIn() {
        val tag = "$atag-beginGoogleSignIn"
        oneTapClient.beginSignIn(signUpRequest)
            .addOnSuccessListener(this) { result ->
                try {
                    startIntentSenderForResult(
                        result.pendingIntent.intentSender,library.GOOGLE_SIGNIN_REQUEST_CODE,null,0)
                } catch (e: IntentSender.SendIntentException) {
                    logg.d(atag,"Couldn't start One Tap UI: ${e.localizedMessage}")
                }
            }
            .addOnFailureListener(this) { e ->
                // No Google Accounts found. Just continue presenting the signed-out UI.
                toaster.show("Please sign in to your google account on your phone")
                logg.d(tag,e.localizedMessage)
            }
    }

  override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        val tag = "$atag-onActivityResult"
        
        super.onActivityResult(requestCode,resultCode,data)
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == library.GOOGLE_SIGNIN_REQUEST_CODE) {
            try {
                val credential = oneTapClient.getSignInCredentialFromIntent(data)
                token = credential.googleIdToken
                when {
                    token != null -> {
                        // Got an ID token from Google. Use it to authenticate
                        // with your backend.
                        login = credential.id
                        name = credential.displayName
                        avatarUrl = credential.profilePictureUri.toString()
                        tryToLogin()
                    }
                    else -> {
                        // Shouldn't happen.
                        logg.d(atag,"No ID token!")
                    }
                }
            } catch (e: ApiException) {
                when (e.statusCode) {
                    CommonStatusCodes.CANCELED -> {
                        toaster.show("Please sign in to your google account on your phone")
                        logg.d(tag,"One-tap dialog was closed.")
                        // Don't re-prompt the user.
                    }
                    CommonStatusCodes.NETWORK_ERROR -> {
                        logg.d(tag,"One-tap encountered a network error.")
                        // Try again or just ignore.
                    }
                    else -> {
                        logg.d(tag,"Couldn't get credential from result." +
                            " (${e.localizedMessage})")
                    }
                }
            }
        }
    }
}

主要问题是在某些 AVD 上运行良好,在其他 AVD id 上出现错误

16: Cannot find a matching credential.

但是在此 AVD 上,Google 服务是最新的,并且用户登录 Google Play

在真实设备上,我收到此错误

10: Caller not whitelisted to call this API.

此处的 Google 服务也是最新的,并且用户登录 Play 商店。

我在任何地方都使用了真实的 Gmail 地址。

有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...