2

ここで説明されている「Google Domain Shared Contacts API」を取得しようとしています: https://developers.google.com/admin-sdk/domain-shared-contacts/

ここで説明されている「サーバー間アプリケーション用の OAuth 2.0」を使用して作業する: https://developers.google.com/accounts/docs/OAuth2ServiceAccount

OAuth ページからの推奨事項は、提供されている Google クライアント ライブラリを使用することです... 私は Java ライブラリを使用しています。しかし、Shared-Contacts API にはこのライブラリを使用する例がなく、Shared-Contacts API でライブラリを使用する方法を理解するのに苦労しています。

OAuth が機能する例を作成できました... Google Cloud Storage を使用しています。コードのスニペットを次に示します。

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 "; STORAGE_SCOPE 変数を次の文字列に変更しました: STORAGE_SCOPE = " http://www.google.com/m8/feeds/ ";

共有連絡先のxml文字列が返されることを願っています。しかし、代わりに、次のエラーが返されます: 403 Cannot request contacts attached to another domain

認証リクエストを行うときに「hd」パラメーターを指定していないため、このエラーが発生していると思います...ただし、GoogleCredential オブジェクトを使用して「hd」パラメーターを指定する方法がわかりません (または「スコープ」を除く他のパラメーター)...誰かがそれを手伝ってくれますか?

4

1 に答える 1

3

ここでの問題は、ドメインで偽装するユーザーを指定していないことだと思います (また、サービス アカウントがドメイン内のユーザーを偽装することを許可するようにドメインのセキュリティ設定を構成していません)。

doubleclick API 認証ドキュメントには、これを行う方法の良い例があります。彼らのサンプルを使用して、スコープと API エンドポイントを置き換えることができます。

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

于 2014-05-24T15:07:22.197 に答える