Google Domain Shared Contacts API使用OAuth 2.0实现服务器到服务器应用程序 - 凭证参数

时间:2014-05-23 02:44:15

标签: google-api google-oauth google-admin-sdk google-oauth-java-client

我试图获得" Google域共享联系人API"这里描述: https://developers.google.com/admin-sdk/domain-shared-contacts/

使用" OAuth 2.0 for Server to Server Applications"这里描述: https://developers.google.com/accounts/docs/OAuth2ServiceAccount

OAuth页面的建议是使用提供的Google客户端库...我正在使用Java库。但是,Shared-Contacts API没有使用此库的示例,而且我在查找如何将库与Shared-Contacts API一起使用时遇到了问题。

我能够让OAuth的示例为我工作......它使用Google云端存储。这是代码的片段:

String STORAGE_SCOPE = "https://www.googleapis.com/auth/devstorage.read_write";
try {
          try {
      httpTransport = GoogleNetHttpTransport.newTrustedTransport();
      String p12Content = Files.readFirstLine(new File(keyFile), Charset.defaultCharset());
      // Build service account credential.
      GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
          .setJsonFactory(JSON_FACTORY)
          .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
          .setServiceAccountScopes(Collections.singleton(STORAGE_SCOPE))
          .setServiceAccountPrivateKeyFromP12File(new File(keyFile))
          .build();

      // Set up and execute Google Cloud Storage request.
      String URI;

      URI = "https://storage.googleapis.com/" + BUCKET_NAME;
      HttpRequestFactory requestFactory = httpTransport.createRequestFactory(credential);
      GenericUrl url = new GenericUrl(URI);
      HttpRequest request = requestFactory.buildGetRequest(url);
      HttpResponse response = request.execute();
      content = response.parseAsString();
          } catch (IOException e) {
              System.err.println(e.getMessage());
            }
          } catch (Throwable t) {
            t.printStackTrace();
          }   
      return content;

要求获取GCS上某个存储桶中的内容列表。它使用Credentials对象调用特定URL,其中Credentials对象使用我下载的密钥文件完成OAuth的工作。还有其他步骤让它工作(设置服务帐户电子邮件等),我做了。它返回一个包含存储桶内部内容的xml字符串,对我来说效果很好。

然后我尝试将URI更改为此字符串: URI =" https://www.google.com/m8/feeds/contacts/myGoogleAppsDomain.com/full&#34 ;; 我将STORAGE_SCOPE变量更改为此字符串: STORAGE_SCOPE =" http://www.google.com/m8/feeds/&#34 ;;

希望它会返回共享联系人的xml字符串。但相反,它会返回此错误: 403无法请求属于其他域的联系人

我相信我收到此错误是因为我没有指定" hd"我执行身份验证请求时的参数...但是,我不确定如何指定" hd"使用GoogleCredential对象的参数(或其他参数,除了"范围")...有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

我认为此处的问题是您没有指定要在域中模拟的用户(并且您尚未在域中配置安全设置以授权服务帐户模拟域中的用户)。< / p>

doubleclick API auth文档提供了有关如何执行此操作的很好示例。您可以使用他们的示例并替换范围和API端点:

https://developers.google.com/doubleclick-publishers/docs/service_accounts#benefits