谷歌登录错误 getToken() -> NEED_REMOTE_CONSENT。

11
几个月前,我的Google登录过程没有问题,但今天模拟器在Logcat中回复我这个错误:
E/Auth: [GoogleAccountDataServiceImpl] getToken() -> NEED_REMOTE_CONSENT. App: com_pro.bandweb.mycpstore, Service: oauth2:email https://www.googleapis.com/auth/spreadsheets.readonly openid profile
试图在Google上寻找解决方法,但是没有找到任何建议...这是我用于登录的代码:
public void InitGoogle() throws IOException {
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestScopes(new Scope(SPREADSHEETS_SCOPE))
                .requestEmail()
                .build();
        googleSignInClient = com.google.android.gms.auth.api.signin.GoogleSignIn.getClient(this, gso);

        if (GoogleSignIn.getLastSignedInAccount(this) == null) {
            Log.v(TAG, "getting sign-on again");
            //startActivityForResult(googleSignInClient.getSignInIntent(), RC_SIGN_IN);
            SignInActivityResult.launch(googleSignInClient.getSignInIntent());
        } else {
            Log.v(TAG, "sign-on is still good, reusing");

            //faccio la richiesta solo se è stato inserito il foglio di google shhet nelle preferenze, altrimenti avviso
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            if (!sharedPreferences.contains(getString(R.string.pref_googleSheetId_key))
                    || StringUtils.isBlank(sharedPreferences.getString(getString(R.string.pref_googleSheetId_key), ""))
                    || !(spreadsheetIdPattern.matcher(sharedPreferences.getString(getString(R.string.pref_googleSheetId_key), ""))).find()) {
                // no Google sheet ID has been specified - can't retrieve ingredients
                progressBar.setVisibility(ProgressBar.GONE);
                Toasty.info(this, getString(R.string.missing_pref_id_sheet_title), Toasty.LENGTH_LONG, true).show();
            }else {
                //scelgo il tipo di sincronizzazione quando inizializzo il tablet, in base alla scelta nelle preferenze
                if(AppSettings.get().getSyncModeOnStartup() == UPLOAD_DATI)
                    synchGoogleSheet(UPLOAD_DATI);
                else if(AppSettings.get().getSyncModeOnStartup() == DOWNLOAD_DATI)
                    synchGoogleSheet(DOWNLOAD_DATI);
                else
                    synchGoogleSheet(UPLOAD_DOWNLOAD_NONE);
            }
        }
        progressBar.setVisibility(ProgressBar.GONE);

..
..
..
..





ActivityResultLauncher<Intent> SignInActivityResult= registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result.getResultCode() != RESULT_CANCELED) {
                    if (result.getResultCode() == Activity.RESULT_OK && null != result.getData())
                    {
                        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(result.getData());
                        handleSignInResult(task);
                    }
                }else{
                    progressBar.setVisibility(ProgressBar.GONE);
                }
            }
        });

你有找到解决方法吗? - user987362
no Unfortunately... - Andy Band
上周它还能正常工作。 - user987362
嗨,@AndyBand,这个问题有什么进展吗?你找到解决方案了吗? - spiraldev
7个回答

2
确保您完成以下所有步骤:
  • 按照 @Tomáš Hubálek 上面所说的设置Google云控制台,使用正确的SHA1密钥(如果您的应用程序已发布,则请注意PlayStore控制台中有关Google应用签名密钥的说明)。

在我的情况下,在尝试多种解决方案而无法工作之后。我找到并使用了此解决方案,仅适用于UserRecoverableAuthIOException错误,并且它起作用。

Java版本

catch (UserRecoverableAuthIOException userRecoverableException) {
   myActivity.startActivityForResult(
   userRecoverableException.getIntent(), MyActivity.REQUEST_AUTHORIZATION);
}

Kotlin版本
catch (e: Exception) {
   if (e is UserRecoverableAuthIOException) {
   myActivity.startActivityForResult(e.getIntent(), MyActivity.REQUEST_AUTHORIZATION);
   } else {
      // other cases
   }
}
   

有没有任何情况(也许是与生产/公共用户一起),会导致它陷入某个无限循环中,使用户不断被发送到认证屏幕? - Brian
如果我没有错的话,当收到谷歌用户可恢复授权异常时,我们需要重新进行用户身份验证,但如果我们尝试这样做,它将进入认证过程的无限循环。 - Vikrant Shah
你们可以捕捉重试操作。另外,在循环中出现异常时,尝试记录日志(到 Firebase)。 - NamNH

1

我在使用Android 11的Google Pixel 5手机上遇到了同样的问题。

2021-08-11 13:32:59.603 29917-30363/? E/Auth: [GoogleAccountDataServiceImpl] getToken() -> NEED_REMOTE_CONSENT. App: de.aoksystems.ma.abp.app.internal, Service: oauth2:https://www.googleapis.com/auth/fitness.activity.read https://www.googleapis.com/auth/fitness.heart_rate.read https://www.googleapis.com/auth/fitness.nutrition.read

但在安卓11的三星S10上它能够正常工作。

4周前它能够正常工作。


在 Pixel 6 / Android 12 上出现了相同的问题。 - P. Sohm

0

我遇到了同样的错误,对我来说看起来与我的Google账户有关。

我的应用程序使用Google Drive API,自2016年以来我没有更改过代码。我不经常使用这个应用程序,但在过去的一年中,集成驱动器在运行Android 8的旧手机上停止工作。我刚刚换了一部运行Android 11的新手机,在那里也出现了同样的错误。然而,还有一个人在使用我的应用程序,他们完全没有任何问题(也是Android 11)。

在我的Google账户的安全部分,我的应用程序曾经出现为具有第三方访问权限,但现在已经消失了,我知道我自己不会撤销它。对于我的应用程序的其他用户,它仍然存在于他们的帐户中。

更新:我已经成功解决了这个问题,而没有实际对应用程序进行任何代码更改。我设置了一个模拟器(Pixel 5,Android 11),连接到我的Google账户,运行我的应用程序,它正确地显示了同意屏幕,而不是返回此错误。在允许后,因此我的应用程序现在出现在我的帐户中具有第三方访问权限,应用程序的功能立即在我的手机上恢复了。

听起来这个解决方案并不适用于每个人,但至少在我的情况下,这个错误信息似乎意味着我的帐户没有为我的应用程序授权,并且被卡住了,需要另一个设备/模拟器来“强制”通过。


这并没有真正回答问题。如果您有其他问题,可以点击提问来提出。若要在有新的答案时收到通知,请关注此问题。一旦您获得足够的声望,您也可以添加悬赏以吸引更多的关注。- 来自审查 - matt5784

0

我在使用Google Drive API时遇到了同样的问题。我请求了DRIVE_FILE和DRIVE范围的权限。我删除了请求DRIVE范围的权限,问题就消失了。我相信这个问题会遇到没有在Google API控制台中获得必要权限的开发人员。因此,您应该在那里检查您的权限。


0
在我的应用程序中,这个错误信息是由缺少OAuth同意屏幕引起的。要解决这个问题,您需要执行以下操作:
  1. 进入Google Cloud控制台
  2. 选择您的项目
  3. 选择API和服务
  4. 选择OAuth同意屏幕
  5. 填写所有必需的信息
完成上述步骤后,NEED_REMOTE_CONSENT 错误将立即消失。

-1
在我的情况下,这似乎可能与Android 12有关。
我的应用程序在Android R(API30)上运行和验证正常,但当我在Android S(API31)上部署相同的apk时,我收到完全相同的错误消息:
E/Auth: [GoogleAccountDataServiceImpl] getToken() -> NEED_REMOTE_CONSENT.  In both cases I'm testing on the Android Emulator as well a physical devices.

在我的情况下,问题在于访问Google Fit和Google Tasks API。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接