2012-07-22 184 views
6

错误,我得到:获取用户信息

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(); 

我在网上搜索过,并且我得到了很少的例子和稀有材料。 任何机构有任何想法吗?

我在做什么错了?

回答

5

我在猜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 **

希望这将帮助你

+0

完美!谢谢Javiercbk。 – 2012-08-12 07:43:47

0

为了检索您有权要求其OAuth的范围访问的用户信息API数据:

https://www.googleapis.com/auth/userinfo.profile

,如果你想获取电子邮件地址,同时添加范围https://www.googleapis.com/auth/userinfo.email

在您的代码中,我没有看到您设置您请求访问的OAuth范围的位置。

+0

我已经加入该范围,以及...及其工作细...授权之后我得不到所需的响应。总之,我还包括电子邮件范围。 – 2012-07-22 18:21:26

1

如果您已经获得访问令牌(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>