0

我在使用 Google Play 服务让 Google 身份验证在我的 android 应用程序中工作时遇到了一些问题。首先,我使用库提供的示例使用以下范围获取令牌

GoogleAuthUtil.getToken(getActivity(), mEmail,"oauth2:https://www.googleapis.com/auth/userinfo.profile");

然后我使用令牌来获取有关用户的更多信息:

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + token);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

那行得通。然后,我使用Google Developers Blog 上的“验证来自 Android 应用程序的后端调用”帖子向我的 Web 服务器验证应用程序用户。所以我将 getToken 的范围替换为

audience:server:client_id:<webapp_clientId_for_localhost>.apps.googleusercontent.com

并使用与文章中类似的检查器来验证服务器端的受众和 clientId(Android 客户端 ID)。这也有效,但是,如果我尝试使用 userinfo API 从 android 应用程序或 Web 应用程序获取有关用户(名字和姓氏)的更多信息,我会得到:

{“错误”:{“错误”:[{“域”:“全局”,“原因”:“authError”,“消息”:“无效凭据”,“位置类型”:“标题”,“位置”:“授权”}],“代码”:401,“消息”:“无效凭证”}}

我使用的代码是:

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Authorization", "OAuth " + token);
con.setRequestProperty("ContentType", "application/json; charset=UTF-8");

知道为什么 userinfo 不起作用吗?还有什么我应该添加到范围的吗?

4

1 回答 1

3

您用于后端验证的令牌适用于您的服务器,而带有 oauth2: 的令牌适用于 Google。此时没有同时请求两个令牌的机制,因此您需要对 GoogleAuthUtil 进行两次调用。在一个同意步骤之后,您应该能够请求两者(一次一个)。实际上,oauth2: 令牌的使用频率应该较低,因为您可以将用户的个人资料数据与您在家庭服务器中从他们那里获得的帐户相关联。

于 2013-02-18T04:14:58.167 回答