从Oauth2 Google Contacts API获取Userinfo

我得到的错误:

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()为null。

我已经通过像这样设置一个自定义请求初始化程序来解决这个问题

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

Google的文档规定了以下内容:

**例如,使用access_token查询字符串参数调用UserInfo API如下所示:

GET https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken}使用HTTP标头中的访问令牌调用同一API,如下所示:

GET / oauth2 / v1 / userinfo HTTP / 1.1授权:Bearer {accessToken}主机:googleapis.com **

希望对你有帮助

如果您已获得访问令牌( GoogleTokenResponse ),那么您也可以这样做:

 HttpTransport transport = new NetHttpTransport(); List 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": "http://sofzh.miximages.com/java/photo.png", "gender": "male", "locale": "de" } 

如果你想要,你可以使用Jackson将userIdentity解析为你自己的类:

 ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper(); mapper.readValue(userIdentity, YourUser.class); 

以下是我用于此示例的依赖项:

  com.google.apis google-api-services-plus v1-rev401-1.22.0   org.codehaus.jackson jackson-mapper-asl 1.9.13 jar  

要从Userinfo API检索数据,您必须请求访问其OAuth范围:

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

如果要检索电子邮件地址,还要添加范围https://www.googleapis.com/auth/userinfo.email

在您的代码中,我看不到您在哪里设置要请求访问的OAuth范围。