現在、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をサポートするかどうか疑問に思っています。