2015-06-07 32 views
0

我有一个运行了几年的Java应用程序,它将一些数据库中的一些联系人同步到客户的Gmail账户中。如何验证Google Contacts API的Java应用程序?

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

第一个问题:我认为现在唯一受支持的认证是OAuth2吗?

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

通常,应用程序使用服务帐户当应用程序 使用谷歌API的使用自己的数据,而不是用户的数据进行工作。

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

对于场景的文件有这样一段话:

如果你有一个谷歌Apps域 - 如果你使用谷歌Apps for Work的,对于 例如,一个在谷歌Apps域的管理员可以授权一个 应用程序代表Google Apps 域中的用户访问用户数据。例如,使用Google Calendar API 向Google Apps域 中所有用户的日历添加事件的应用程序将使用服务帐户代表用户以 的身份访问Google Calendar API。授权服务帐户访问代表域中用户的数据 有时被称为“委托 域范围的权限”给服务帐户。

但是,我没有Google Apps域。

那么......现在呢?

回答

1

第一个问题:我认为现在唯一受支持的认证是OAuth2吗?

所以......现在怎么办?

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

  • 如果您的应用程序有一个刷新令牌,它可以在任何时间,访问授予的
  • 因为刷新令牌的权力资源,它需要被安全地存储,只是像密码

获得刷新令牌所需的步骤都在这里How do I authorise an app (web or installed) without user intervention? (canonical ?)

描述这个问题的答案还包含指向谷歌文档如何使用刷新令牌来获得访问令牌的链接。

+0

感谢这个!我不知道刷新令牌。今晚我会说一声。 – Zalumon

+0

这工作:-)。伟大的指导!我欠你很多时间。 – Zalumon

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()) 
{ 
    ... 
} 
+1

发布代码的荣誉。一个建议。在某些情况下,刷新标记可能会失效,因此我可能会建议将其存储在数据文件中,而不是字符串文字。 – pinoyyid

相关问题