我有一个运行了几年的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域名。
所以...现在是什么?
答案 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())
{
...
}