如何验证Google Contacts API的Java应用程序?

时间:2015-06-07 23:02:48

标签: java google-oauth gdata google-contacts

我有一个运行了几年的java应用程序,它将某些数据库中的某些联系人同步到了客户的gmail帐户。

这几天前停止了工作,大概是因为Google stopped supporting简单的用户名/密码验证。

第一个问题:假设现在唯一支持的身份验证是OAuth2,我是否正确?

假设是这种情况,我不明白我应该使用哪种授权方案/流程。我无法显示对话框 - 这是一种服务类型的应用程序,它应该只访问我控制的一个特定客户帐户。我想我应该使用Service Account,但文档说明了这一点:

  

通常,应用程序在应用程序时使用服务帐户   使用Google API处理自己的数据,而不是用户的数据。

但我想使用用户数据 - 特别是联系人。

对于那种情况,文档可以这样说:

  

如果您有Google Apps域 - 如果您使用的是Google Apps for Work,则可以使用   示例 - Google Apps域的管理员可以授权   应用程序代表Google Apps中的用户访问用户数据   域。例如,使用Google Calendar API的应用程序   将事件添加到Google Apps域中所有用户的日历   将使用服务帐户访问Google Calendar API   代表用户。授权服务帐户访问数据   代表域中的用户有时被称为"委托   域名权威"到服务帐户。

但是,我没有Google Apps域名。

所以...现在是什么?

2 个答案:

答案 0 :(得分:1)

第一个问题:假设现在唯一支持的身份验证是OAuth2,我是否正确?

所以...现在是什么?

与用户名密码最接近的类比是刷新令牌(它只是一个字符串)。 IE: -

  • 如果您的应用有刷新令牌,它可以随时访问授予它的资源
  • 由于刷新令牌的强大功能,它需要安全存储,就像密码一样

此处介绍了获取刷新令牌所需的步骤How do I authorise an app (web or installed) without user intervention? (canonical ?)

该答案还包含指向Google文档的链接,指向如何使用刷新令牌获取访问令牌。

答案 1 :(得分:1)

这里有一些代码(基于pinoyyid的建议):

String CLIENT_ID = "see instructions in accepted answer";
String CLIENT_SECRET = "see instructions in accepted answer";
String REFRESH_TOKEN = "see instructions in accepted answer";

Builder builder = new GoogleCredential.Builder();
builder.setTransport(GoogleNetHttpTransport.newTrustedTransport());
builder.setJsonFactory(JacksonFactory.getDefaultInstance());
builder.setClientSecrets(CLIENT_ID, CLIENT_SECRET);

Credential credential = builder.build();
credential.setRefreshToken(REFRESH_TOKEN);
credential.refreshToken(); // gets the access token, using the refresh token

ContactsService contactsService.setOAuth2Credentials(credential);

Query query = new Query(new URL("https://www.google.com/m8/feeds/contacts/default/full"));
query.setMaxResults(10_000);

ContactFeed allContactsFeed = contactsService.getFeed(query, ContactFeed.class);

LOGGER.log(Level.INFO, allContactsFeed.getTitle().getPlainText());

for(ContactEntry contact : allContactsFeed.getEntries())
{
  ...
}