从Oauth2 Google Contacts API获取Userinfo

时间:2012-07-22 17:15:08

标签: java google-api oauth-2.0 google-contacts 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();

我在网上搜索过,我得到的内容和稀有材料的例子都很少。 有没有人知道呢?

我做错了什么?

3 个答案:

答案 0 :(得分: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()

Google documentation指定以下内容:

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

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

GET / oauth2 / v1 / userinfo HTTP / 1.1 授权:持票人{accessToken} 主持人:googleapis.com **

希望这会对你有所帮助

答案 1 :(得分: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"
}

如果您愿意,可以使用Jackson将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>

答案 2 :(得分:0)

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

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

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

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