获取用户信息
错误,我得到:获取用户信息
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "global",
"location" : "Authorization",
"locationType" : "header",
"message" : "Invalid Credentials",
"reason" : "authError"
} ],
"message" : "Invalid Credentials"
}
下面的代码,我使用:
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY)
.setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).build();
credential.setAccessToken(tokenResponse.getAccessToken());
credential.setAccessToken(tokenResponse.getRefreshToken());
到这里,我得到刷新令牌,访问令牌等
Oauth2 userInfoService = new Oauth2.Builder(this.TRANSPORT,
this.JSON_FACTORY, credential.getRequestInitializer())
.setApplicationName(Constants.APPLICATION_NAME).build();
它无法以低于行:(不知道,为什么呢?)
Userinfo userInfo = userInfoService.userinfo().get().execute();
我在网上搜索过,并且我得到了很少的例子和稀有材料。 任何机构有任何想法吗?
我在做什么错了?
我在猜credential.getRequestInitializer()为空。
我已经这样
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY)
.setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).setRequestInitializer((new HttpRequestInitializer(){
@Override
public void initialize(HttpRequest request)
throws IOException {
request.getHeaders().put("Authorization", "Bearer " + accessToken);
}
})).build()
谷歌的documentation especifies以下的自定义请求初始化设置为凭据对象解决了这个:
** 例如,为用户信息API的调用使用access_token查询字符串参数如下所示:
GET https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} 使用访问权限调用相同的API ken在HTTP标头中看起来如下所示:
GET/oauth2/v1/userinfo HTTP/1.1 授权:承载者{accessToken} 主持人:googleapis。COM **
希望这将帮助你
为了检索您有权要求其OAuth的范围访问的用户信息API数据:
https://www.googleapis.com/auth/userinfo.profile
,如果你想获取电子邮件地址,同时添加范围https://www.googleapis.com/auth/userinfo.email
。
在您的代码中,我没有看到您设置您请求访问的OAuth范围的位置。
我已经加入该范围,以及...及其工作细...授权之后我得不到所需的响应。总之,我还包括电子邮件范围。 – 2012-07-22 18:21:26
如果您已经获得访问令牌(GoogleTokenResponse),那么你也可以这样做:
HttpTransport transport = new NetHttpTransport();
List<String> applicationScopes = Arrays.asList(
PlusScopes.USERINFO_EMAIL,
PlusScopes.USERINFO_PROFILE
);
GoogleAuthorizationCodeFlow flow
= new GoogleAuthorizationCodeFlow.Builder(
transport,
JacksonFactory.getDefaultInstance(),
"your-client-id.apps.googleusercontent.com",
"your-client-secret",
applicationScopes).build();
String userId = googleTokenResponse.parseIdToken().getPayload().getSubject();
Credential credential = flow.createAndStoreCredential(googleTokenResponse, userId);
HttpRequestFactory requestFactory = transport.createRequestFactory(credential);
GenericUrl url = new GenericUrl("https://www.googleapis.com/oauth2/v1/userinfo");
HttpRequest request = requestFactory.buildGetRequest(url);
String userIdentity = request.execute().parseAsString();
然后userIdentity
是这样的:
{
"id": "105358994046791627189",
"name": "Benny Neugebauer",
"given_name": "Benny",
"family_name": "Neugebauer",
"link": "https://plus.google.com/+BennyNeugebauer",
"picture": "https://lh4.googleusercontent.com/-dtvDIXCEtFc/AAAAAAAAAAI/AAAAAAAAAoE/1CKd3nH9rRo/photo.jpg",
"gender": "male",
"locale": "de"
}
如果你愿意,你可以使用杰克逊userIdentity
解析到自己的类:
ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
mapper.readValue(userIdentity, YourUser.class);
下面是我用这个例子的依赖关系:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-plus</artifactId>
<version>v1-rev401-1.22.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
<type>jar</type>
</dependency>
完美!谢谢Javiercbk。 – 2012-08-12 07:43:47