Google通讯录 - 使用服务帐户获取其他用户的联系人

时间:2013-12-10 12:08:32

标签: google-apps google-api-java-client google-contacts

我正在尝试使用Google服务帐户获取其他用户的联系人。我甚至将用户凭据设置为我想要获取联系人的帐户的用户名和密码。但是,我一直收到错误 - 线程“main”中的异常com.google.gdata.util.ServiceForbiddenException:无法请求属于其他用户的联系人

最初我使用管理员帐户来获取另一个用户的联系人,我一直收到Forbidden错误。我被告知服务帐户将在这种情况下工作。

有人可以帮忙吗?是否真的可以通过服务帐户或任何其他方法获取其他帐户的联系人?如果是的话,任何想法为什么我必须得到这个错误?

2 个答案:

答案 0 :(得分:1)

如果您想使用服务帐户访问用户的联系人,则需要做三件事(请参阅https://developers.google.com/accounts/docs/OAuth2ServiceAccount):

  1. Google Developers Console
  2. 中创建服务帐户
  3. 使用域名Admin console
  4. 将域范围的权限委派给服务帐户
  5. (必须访问联系人:) 模拟用户,方法是使用setServiceAccountUser工厂的GoogleCredential方法指定用户帐户的电子邮件地址。
  6. 例如:

    GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(JSON_FACTORY)
      .setServiceAccountId(emailAddress)
      .setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
      .setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
      .setServiceAccountUser("user@example.com")
      .build();
    

    错误消息Cannot request contacts belonging to another user表示您忘记了最后一步。

答案 1 :(得分:0)

如果您的服务帐户客户端在域级别列出白名单,则您只能使用服务帐户访问其他人的联系人。换句话说 - 如果没有管理员访问权限,您就不能在跨越域边界的任意地获取其他人的联系人。

最简单的选择是使用OAuth 2 Web服务器或客户端流程 - 每个用户必须授权您访问数据。