5

現在、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());
    }

問題は、アカウントから 1 件の連絡先も取得できないことです。フィードは常に空です。エラーはありません。何もない。

同じ方法で Google Apps マネージド ドメインにアクセスすると、うまく機能します。

p12キーファイルとサービスアカウントを使用する場合、Contacts Apiが通常の(別名@gmail.com)アカウントのOAuth 2.0をサポートするかどうか疑問に思っています。

4

3 に答える 3

1

私も同じ問題に遭遇しました。

キーをセットアップしたときに受け取ったメール アドレスと、ドメイン管理者のメール アドレスの両方を試しました。

キー設定からの電子メールを使用すると、何も受信しません。警告も例外もデータもありません。

ドメイン管理者の電子メール アドレスを使用すると、例外が発生します。

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

...

そのため、ドメイン管理者のメール アドレスは必要なものではないと判断しました。

次に、このページを見つける前に、しばらくグーグルで検索しました。

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) があります。

そのフィールドを適切な値に設定すると、続行できました。

振り返ってみると、それはすべて理にかなっています。仕事をしようとしているアカウントを提供しないと、そのアカウントの連絡先を取得できません。

于 2013-02-05T17:59:54.683 に答える
0

今日、まったく同じエラーに出くわしましたが、今のところサービス アカウントの使用をあきらめました。サービス アカウントは現在 Contacts API でサポートされていないと思います。そのため、OAuth 1.0 で Contacts API v3 を使用しており、期待どおりの結果が得られています。

 ContactsService contactsService = new ContactsService(APPLICATION_NAME);
 contactsService.setUserCredentials(CLIENT_USERNAME, CLIENT_SECRET);

 URL contactFeedURL = new URL("https://www.google.com/m8/feeds/contacts/default/full");
 Query contactFeedQuery = new Query(contactFeedURL);

 ContactFeed contactFeed = contactsService.getFeed(contactFeedQuery, ContactFeed.class);
于 2013-03-26T01:39:25.673 に答える
0

Google API コンソールのGoogle API コンソールではサポートされていないため、現在、サービス アカウントを使用して連絡先にアクセスすることはできません。

参照:サービス アカウント

次に、ドメインの管理者が以下のプロセスでサービス アカウントへのアクセスを許可する必要があるため、Google マネージド ドメインでのみ機能します。

ドメイン全体の権限をサービス アカウントに委任する

作成したサービス アカウントには、アクセスする Google Apps ドメインのユーザー データへのアクセス権を付与する必要があります。次のタスクは、Google Apps ドメインの管理者が実行する必要があります。

  1. Google Apps ドメインのコントロール パネルに移動します。URL は「www.google.com/a/cpanel/mydomain.com」のようになります。

  2. [高度なツール...] > [サード パーティの OAuth クライアント アクセスを管理する] に移動します。

  3. [クライアント名] フィールドに、サービス アカウントのクライアント ID を入力します。

  4. [1 つ以上の API スコープ] フィールドに、アプリケーションにアクセスを許可するスコープのリストを入力します。

  5. [承認] ボタンをクリックします。

于 2013-03-05T14:08:12.773 に答える