如何开始使用OAuth2 for Google Contacts API

时间:2015-08-11 17:03:12

标签: java google-api google-contacts google-oauth2

我正在尝试使用带有OAuth 2身份验证的Google Contacts API。但是一些旧的示例代码现在不适用于这个API。我找到了一个示例代码,它提出了访问令牌的请求,作为回应,Google服务器会给我一个约1小时限制的访问令牌和一个刷新令牌。 但是这段代码存在一些问题

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

            String APPLICATION_NAME = "PROJECT_NAME";
            String SERVICE_ACCOUNT_EMAIL = "NUMERCALS-ALPHANUMERICALS@developer.gserviceaccount.com";
            java.io.File p12File = new java.io.File("PROJECT_NAME-NUMERICALS.p12");

            GoogleCredential credential = 
                    new GoogleCredential.Builder()                                                                    
                  .setTransport(httpTransport)                                                     
                  .setJsonFactory(jsonFactory)                                                   
                  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)   
                  .setServiceAccountScopes(
                        Collections.singleton("https://www.google.com/m8/feeds"))                                                          
                  .setServiceAccountPrivateKeyFromP12File(p12File)                                                  
                  .setServiceAccountUser("user@example.com")
                  .build();

            if (!credential.refreshToken()) {
                throw new RuntimeException("Failed OAuth to refresh the token");
            }

            ContactsService service = new ContactsService(APPLICATION_NAME);
            service.setOAuth2Credentials(credential);

            Query gQuery = new Query(new java.net.URL("https://www.google.com/m8/feeds/groups/user@example.com/full"));
            gQuery.setMaxResults(32767);
            ContactGroupFeed groupFeed = service.query(gQuery, ContactGroupFeed.class);

            for (ContactGroupEntry group : groupFeed.getEntries()) {

我遇到了一些问题

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:269)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
    at javaCode.FinalCode.main(FinalCode.java:68)

我是新手,将OAuth2用于Google API,因此如果我在某处错误或提供正常工作的代码段,请引导我。这将是很好的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

在您的示例中,您尝试使用服务帐户来模拟用户。 虽然这是可能的,但只能通过谷歌的工作或谷歌的教育帐户来实现。 它不适用于普通的Gmail帐户。

如果您的用例属于这种情况,请记住,域管理员应该授予您的应用程序访问权限,并且还应该授予Domain wide delegation of authority

但如果您只是尝试使用API​​进行一些测试,那么使用普通OAuth会更好。

选中tutorial,我知道是针对云端硬盘的,但您可以看到获取授权令牌的基本步骤。获得后,对不同Google Apis的调用非常相似。

我建议查看OAuth Playground。在那里,您可以查看完整的OAuth流程,然后就可以使用API​​。