google-api - 通过 OAuth 2.0 和私钥又名服务帐户访问 Google Contacts Api

标签 google-api oauth-2.0 gdata-api google-contacts-api service-accounts

我目前正在通过 OAuth 2.0 和所谓的服务帐户实现对 Google 通讯录的访问。服务帐户是为像“My.Name@gmail.com”这样的普通用户生成的。

生成 OAuth 2.0 凭证的代码是:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException {
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes("https://www.google.com/m8/feeds")
            .setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH))
            .build();
    credential.refreshToken();
    return credential;
}

然后我尝试通过以下方式检索联系人:
    ContactsService myService = new ContactsService(
            "myApp");

    myService.setOAuth2Credentials(getCredentials());

    URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
    Query myQuery = new Query(feedUrl);
    ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class);
    // Print the results

    for (ContactEntry entry : resultFeed.getEntries()) {
        System.out.println(entry.getName().getFullName().getValue());
        System.out.println("Updated on: " + entry.getUpdated().toStringRfc822());
    }

问题是我没有从我的帐户中获得任何联系人。提要总是空的。没有错误。没有。

通过相同的方法访问 Google Apps 托管域时,它运行良好。

我想知道在使用 p12 key 文件和服务帐户时,Contacts Api 是否支持普通(又名@gmail.com)帐户的 OAuth 2.0。

最佳答案

我自己也遇到了同样的问题。

我尝试了设置 key 时收到的电子邮件地址和域管理员的电子邮件地址。

当我使用来自 key 设置的电子邮件时,我根本没有收到任何东西——没有警告、没有异常(exception),也没有数据。

当我使用域管理员的电子邮件地址时,我收到一个异常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK
     [java] {
     [java]   "error" : "invalid_grant"
     [java] }
     [java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse
     [java] WARNING: Authentication error: Unable to respond to any of these challenges: {}
     [java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn
     [java] WARNING: /
     [java] java.lang.NullPointerException: No authentication header information

...

所以,我认为域管理员的电子邮件地址不是我需要的。

接下来,我在 Google 上搜索了一段时间,然后才找到此页面:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

我在那里看到了getServiceAccountUser()。该字段的描述是:

返回应用程序试图在服务帐户流中模拟的用户的电子邮件地址,如果没有或不使用服务帐户流,则返回 null。

果然,有一个对应的 setServiceAccountUser (String) 接受您使用服务帐户来模拟的用户的用户名(电子邮件地址)。

我将该字段设置为适当的值,然后我就可以继续了。

回想起来,这一切都是有道理的——如果我不提供我正在尝试使用的帐户,我将无法下拉该帐户的联系人。

关于google-api - 通过 OAuth 2.0 和私钥又名服务帐户访问 Google Contacts Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407415/

相关文章:

ruby-on-rails - 在 Ruby 中打开并读取 Google Drive 中的文件

ruby - 如何使用带有 Ruby Google API Client 的 Gmail API 发送消息?

android - 需要使用YouTube API授权Android应用的指南

android - 在 Android 上使用 GData API 的最佳选择?

youtube - YouTube javascript最受欢迎的视频API

java - com.google.gdata.client.GoogleService$CaptchaRequiredException

php - 通过 PHP CURL 添加 Google 联系人

python - 适用于 python 的 Google Api 客户端库不会在文件 : list method with query 中返回 nextPageToken

url - 如何使用 go 在 OAuth 中编写重定向 URL

oauth-2.0 - DotNetOpenAuth 和 OAuth2