Android 请求缺少所需的身份验证凭据。预期的OAuth 2访问令牌

Android 请求缺少所需的身份验证凭据。预期的OAuth 2访问令牌,android,google-signin,Android,Google Signin,我们正在尝试将谷歌签名选项添加到我们的项目中。我们已成功地将此选项添加到站点和ios应用程序中。但在添加到android应用程序时遇到了困难。在这个页面中使用“配置项目”选项,我指定Andrid调试键(Gradle->android->signingReport)的SHA1和包名(com.my.app)。此表单为我们提供WEB类型的客户端ID。我下载了credentials.json并将其放入项目的app文件夹中。我还在Google API控制台中发现了一个android类型的客户端ID,它带有

我们正在尝试将谷歌签名选项添加到我们的项目中。我们已成功地将此选项添加到站点和ios应用程序中。但在添加到android应用程序时遇到了困难。在这个页面中使用“配置项目”选项,我指定Andrid调试键(Gradle->android->signingReport)的SHA1和包名(com.my.app)。此表单为我们提供WEB类型的客户端ID。我下载了credentials.json并将其放入项目的app文件夹中。我还在Google API控制台中发现了一个android类型的客户端ID,它带有指定的SHA1哈希,但我不知道在哪里使用它(如果我们使用android类型的oauth客户端,我们会得到一个错误“signInResult:failed code=10”,所以我们应该使用web类型的客户端,如果API控制台中没有这样的android客户端,我们会得到12500个错误,并且没有令牌)

接下来,我们添加了一个示例代码来获取令牌,并根据本文将其传递给后端服务器

我们得到从“4/0”开始的短令牌。我们不知道这两种类型的令牌与两种获取令牌的方法之间有什么区别,但在后端服务器上,两种类型的令牌都有一个错误:

{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}

例如,对于来自iOS SDK的令牌,我们没有这样的错误。请帮助找出在Android应用程序中实现Google登录的问题所在?

我们使用此解决方案解决了这个问题

GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            AsyncTask.execute(() -> {
                try {
                    String accessToken = GoogleAuthUtil.getToken(context, account.getAccount(), "oauth2:" + Scopes.PLUS_LOGIN);
                    runOnUiThread(() -> {
                        authWithGoogleToken(accessToken);
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            String accessToken = account.getIdToken();
            authWithGoogleToken(accessToken);

我们用这个变通方法解决了这个问题

GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            AsyncTask.execute(() -> {
                try {
                    String accessToken = GoogleAuthUtil.getToken(context, account.getAccount(), "oauth2:" + Scopes.PLUS_LOGIN);
                    runOnUiThread(() -> {
                        authWithGoogleToken(accessToken);
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            String accessToken = account.getIdToken();
            authWithGoogleToken(accessToken);
{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            AsyncTask.execute(() -> {
                try {
                    String accessToken = GoogleAuthUtil.getToken(context, account.getAccount(), "oauth2:" + Scopes.PLUS_LOGIN);
                    runOnUiThread(() -> {
                        authWithGoogleToken(accessToken);
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            String accessToken = account.getIdToken();
            authWithGoogleToken(accessToken);