我正在尝试在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包代码并查看抛出异常的位置?
答案 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)