You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用MongoDB Realm谷歌登录故障求助

Android MongoDB Realm谷歌登录大规模失效问题求助

我司Android应用的MongoDB Realm谷歌登录功能目前在大量用户群体中无法正常使用,耗时多日尝试修复无果,特向有经验开发者请教:是否有成功为所有用户实现该功能的可行方案?

我已尝试ID Token和Auth Code两种登录方式,均出现报错:

尝试的登录方式及报错信息

1. 使用Google ID Token时

报错1:

AUTH_ERROR(realm::app::ServiceError:47): illegal base64 data at input byte 342

22:42:09
AUTH
    at io.realm.internal.network.NetworkRequest.onError(NetworkRequest.java:68)

22:42:09
AUTH
    at io.realm.internal.objectstore.OsJavaNetworkTransport.nativeHandleResponse(Native Method)

22:42:09
AUTH
    at io.realm.internal.objectstore.OsJavaNetworkTransport.handleResponse(OsJavaNetworkTransport.java:98)

22:42:09
AUTH
    at io.realm.internal.network.OkHttpNetworkTransport$1.run(OkHttpNetworkTransport.java:102)

22:42:09
AUTH
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)

22:42:09
AUTH
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)

22:42:09
AUTH
    at java.lang.Thread.run(Thread.java:1012)

报错2:

crypto/rsa: verification error

2. 使用Google Auth Code时

报错:

error exchanging access code with OAuth2 provider

我已查阅所有相关论坛帖子及官方文档,仍毫无头绪,恳请各位提供帮助。

Auth Code方式最新实现代码

override fun onCreate(savedInstanceState: Bundle?) {
    // Start: signin with google
     val gso = GoogleSignInOptions
        .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
         //.requestIdToken("555172020768-kd9ggah2uum9dui095fb0es4r9icf0ug.apps.googleusercontent.com")
         .requestServerAuthCode("555172020768-kd9ggah2uum9dui095fb0es4r9icf0ug.apps.googleusercontent.com")
         //.requestIdToken("555172020768-5qa3i5u536svsahannl3k8q8at3l4dgq.apps.googleusercontent.com")
         .requestEmail()
        .build()


    val googleSignInClient = GoogleSignIn.getClient(this, gso)
    val resultLauncher: ActivityResultLauncher<Intent> =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult())
        { result ->
            val task: Task<GoogleSignInAccount> =
                GoogleSignIn.getSignedInAccountFromIntent(result.data)
            handleSignInResult(task)
        }
    // End: signin with google

    loginwithGoogleButton.setOnClickListener {
        loginWithGoogle(googleSignInClient, resultLauncher)
    }
}

private fun loginWithGoogle(googleSignInClient: GoogleSignInClient, resultLauncher: ActivityResultLauncher<Intent>) {
    val signInIntent: Intent = googleSignInClient.signInIntent
    resultLauncher.launch(signInIntent)
}


private fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) {
    showProgressDialog("Autentificare in curs!")
    try {
        if (completedTask.isSuccessful) {
            val account: GoogleSignInAccount? = completedTask.getResult(ApiException::class.java)
            val email: String? = account?.email
            val firstName = account?.givenName

            account?.serverAuthCode?.let { authCode ->
                account.email?.let { userEmail ->
                    account.givenName?.let { userName ->
                        astaSaFie(authCode, userEmail, userName)
                    }
                }
            }
        } else {
            Log.e(
                "AUTH", "Google Auth failed: "
                        + completedTask.exception.toString()
            )
            onLoginFailed("Google Auth failed:,${completedTask.exception.toString()}")

        }
    } catch (e: ApiException) {
        Log.w("AUTH", "Failed to log in with Google OAuth: " + e.message)
        onLoginFailed("Failed to log in with Google OAuth::,${e.message}")
    }
}


private fun astaSaFie(token: String, email: String, firstName: String) {

    // val googleCredentials = Credentials.google(token, GoogleAuthType.ID_TOKEN)
    val googleCredentials = Credentials.google(token, GoogleAuthType.AUTH_CODE)

    try {
        val urlDecoded = java.util.Base64.getUrlDecoder().decode(token)
        Log.d("JWT", "URL Decoded: $urlDecoded")
    } catch (e: Exception) {
        Log.d("JWT", "e:$e")
    }

    try {
        val decoded = java.util.Base64.getDecoder().decode(token)
        Log.d("JWT", "Decoded: $decoded")
    } catch (e: Exception) {
        Log.d("JWT", "e: $e");
    } 

    try {
        val androidDecoded = android.util.Base64.decode(token, android.util.Base64.DEFAULT)
        Log.d("JWT", "Android Decoded DEFAULT: $androidDecoded")
    } catch (e: Exception) {
        Log.d("JWT", "e: $e");
    } 

    try {
        val urlAndroidDecoded = android.util.Base64.decode(token, android.util.Base64.URL_SAFE)
        Log.d("JWT", "Android Decoded URL_SAFE: $urlAndroidDecoded")
    } catch (e: Exception) {
        Log.d("JWT", "e: $e");
    } 

    taskApp?.loginAsync(googleCredentials) { result ->
        if (result.isSuccess) {
            Log.v(
                "AUTH",
                "Successfully logged in to MongoDB Realm using Google OAuth."
            )
            Helpers().setLoginSuccesfoul(this, true)
            Helpers().setAuthProvider(this, "google")

            //TODO: 1 are limite setate in cont? daca nu are inseamna ca este un user now daca da inseamana ca este un user vechi
            checkifAccountIsNeeded(email, firstName)

        } else {
            hideProgressDialog()
            onLoginFailed("Nu s-a putut crea contul,${result.error}")
            Log.e(
                "AUTH",
                "Failed to log in to MongoDB Realm: ", result.error
            )
        }
    }

}

内容的提问来源于stack exchange,提问作者Rasvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:46:15