【问题标题】:Not able to get Auth Token using GoogleAuthUtil.getToken无法使用 GoogleAuthUtil.getToken 获取 Auth Token
【发布时间】:2016-02-05 20:04:04
【问题描述】:

我正在尝试在 Android 上获取 Auth Token,它可以在我的网络服务器上交换 accessToken 和 RefreshToken。 我正在关注this documentation
特别是部分 - Android 应用获取 Web 后端的离线访问

我的代码:

String WEB_APP_CLIENT_ID = "***.apps.googleusercontent.com";
String scopes = "oauth2:server:client_id:" + WEB_APP_CLIENT_ID+":api_scope:" + Scopes.PLUS_LOGIN + " https://www.googleapis.com/auth/plus.profile.emails.read";
//String this_scope_works_but_gives_access_token = "oauth2:" + Scopes.PLUS_LOGIN + " https://www.googleapis.com/auth/plus.profile.emails.read";
try {
    String authToken = GoogleAuthUtil.getToken(AttachEmailActivity.this, account,scopes);
} catch (GoogleAuthException e) {
    e.printStackTrace();
}

但它总是给我以下异常:

com.google.android.gms.auth.GoogleAuthException: Unknown
com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source)
com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
app.activities.AttachEmailActivity$1.run(AttachEmailActivity.java:437)

我已经阅读并尝试了几乎所有类似问题的解决方案,但仍然失败。我尝试过使用所有不同的客户端 ID - 包括 Web 客户端 ID、服务器应用程序 ID、Android 客户端 ID、其他客户端 ID

事实上,我在我的 JAVA 应用程序之外使用相同的 Web 客户端 ID 使用了 rest API,并且我能够获得所需的身份验证代码。

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=****.apps.googleusercontent.com&redirect_uri=http://localhost&scope=https://www.googleapis.com/auth/plus.login&access_type=offline

但在 Java 应用程序中,我只收到“未知”异常。 谷歌不能提供更多信息吗?什么是未知数?有没有办法获取 com.google.android.gms.auth 包代码并查看异常是从哪里引发的?

【问题讨论】:

  • 您是否已将密钥注册到 Google Developer API 控制台?
  • Niko - 我已将我的凭据仪表板图像添加为问题的一部分。

标签: java android google-oauth google-oauth-java-client


【解决方案1】:

在我的情况下,我需要捕获 UserRecoverableAuthException 来请求用户许可

String scopes = "oauth2:server:client_id:"
        +
        getResources().getString(R.string.google_auth_client_id)
        +
        ":api_scope:" + Scopes.PLUS_LOGIN;
try {
    String token = GoogleAuthUtil.getToken(MyActivity.this,
            Plus.AccountApi.getAccountName(googleApiClient), scopes);
    subscriber.onNext(token);
} catch (UserRecoverableAuthException e) {
    startActivityForResult(e.getIntent(), 888);
    e.printStackTrace();
} catch (GoogleAuthException | IOException e) {
    e.printStackTrace();
}

然后在onActivityResult里面获取token

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 888) {
        if (data != null && resultCode == Activity.RESULT_OK) {
            Bundle extra = data.getExtras();
            String token = extra.getString(getResources()
                    .getString("authtoken"));
            // Do something with your token
        }

        if (!googleApiClient.isConnecting()) {
            googleApiClient.connect();
        }
    }
}

【讨论】:

  • 代码看起来很相似,但对我来说问题出在 getToken 调用本身。如果我使用更简单的范围字符串(即没有 server:client_id"),它会显示身份验证字符串并返回 accessToken。
【解决方案2】:

检查以下内容

1.检查注册的Key是否有效?

2.检查您的密钥是否有 Debug 或 Signatured apk。

3.如果是签名apk的key,则在debug模式下不起作用。

4.so 你应该创建签名 apk 并安装在你的 android 手机上并检查它是否有效?

5.当您在 Android 应用中通过 Gmail 个人资料登录时,您是否有弹出窗口(如下所示)?

6.如果您在选择 gmail 帐户时没有弹出(同意屏幕)。肯定问题出在你的注册密钥上

【讨论】:

  • 我正在使用更简单的范围字符串获得同意屏幕:“oauth2:”+ Scopes.PLUS_LOGIN +“googleapis.com/auth/plus.profile.emails.read”;但对于另一个,我得到了例外。我可以使用其余 API 在浏览器中使用相同的 client_id
  • 我正在使用签名 apk 并在我的设备上进行测试。也许我需要重新开始。 :(
  • 你有 Auth Token 吗?并检查您的 android 移动互联网连接。
  • 正如我所说,我正在使用更简单的范围字符串获取 accessToken。没有互联网问题。
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2021-12-29
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多