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
相关产品推荐
相关产品推荐

