无法使用GoogleAuthUtil.getToken获取Auth Token

时间:2015-11-05 04:48:35

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

我正在尝试在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

事实上,我使用相同的Web客户端ID在我的JAVA应用程序之外使用了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包代码并查看抛出异常的位置?

Here is the view of credentials dashboard

2 个答案:

答案 0 :(得分:0)

在我的情况下,我需要捕获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

中获取令牌
@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();
        }
    }
}

答案 1 :(得分:0)

检查以下内容

1.检查已注册的密钥是否正常工作?

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

3.如果是Signatured apk的密钥,则它不适用于调试模式。

4.所以你应该创建signatured apk并安装在你的Android手机上并检查它是否有效?

5.当您在Android应用中登录Gmail个人资料时,您是否获得了popoup(如下所示)。

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

enter image description here