如何使用Java访问Google Calendar REST API v3

我正在开发一个项目,我必须使用REST访问一组Google日历并使用Java。

该程序位于私人非Google服务器上,定期(通过cron作业)连接到Google帐户,获取链接到该帐户的日历列表,获取每个日历的上个月的事件,并返回包含所有日历的XML文件信息。 该程序应该能够在没有任何用户输入的情况下执行和访问日历。 目前,该项目指定只读取日历,而不是修改日历(因此只会进行GET / LIST调用)。

我查看了Google文档并使用客户端库查看了示例代码,并且在访问日历API之前,几乎所有给出的示例都需要OAuth 2.0用户同意。 甚至REST API文档页面也要求您激活OAuth 2.0以返回所请求的信息(否则返回HTTP 40X错误代码和包含错误状态和消息的JSON文件)。

我如何连接到Google Calendar REST API以获取我需要的信息,一切都是通过REST调用完成的,并且在执行时无需用户同意?

或者我是否过于复杂,只需要在Google云端控制台的Resgistered Apps部分中找到“服务器密钥”?
或者我是否要求同时使用OAuth和开发人员密钥? (我发现有人在标题下提到它:Google Calendar API v3硬编码凭据;然而,问题和解决方案是针对PHP的,我不知道Java中是否可能存在类似的东西)。

  • 我确实看到了创建一个带有服务帐户的JWT的可能性(使用Google云控制台,注册为Web应用程序,并且它位于’证书’下),但是我没有找到如何将这个与REST调用一起使用一个Java程序。
  • 以下链接( http://aleksz-programming.blogspot.be/2012/11/google-calendar-api.html )表示可以通过“Web服务器应用程序”或“已安装的应用程序”访问信息,但不能不详细说明。 但是,在Google OAuth 2.0文档页面上,“Web服务器应用程序”部分仍需要用户输入和同意。 这是真的吗?
  • 我还找到了此页面( https://developers.google.com/accounts/docs/OAuth2Login ),但未能看到如何在不使用用户同意页面的情况下使用它。
  • 我确实看到了一些“双腿OAuth”的引用。 但似乎这不是OAuth 2.0,而是版本1是做事。 这是我项目的可能解决方案吗? 如果是这样,我需要从Google Cloud Console获取哪些信息才能使其正常运行?

我希望我已经提供了足够的信息来说明我正在寻找什么,而且到目前为止还没有涵盖这个问题。 我做了研究,并没有找到足够接近我所寻找的东西。

我无法发布超过2个链接(缺乏声誉),但确实查看了Google Calendar v3 REST API,以及指定创建JWT的页面。

如果您只需要访问一组特定的日历,我会创建一个服务帐户并与该帐户共享必要的日历。

为此:

  1. 在此云控制台中创建“服务帐户”(位于“Web应用程序”/“证书”下)。
  2. 下载私钥并存放在安全的地方。
  3. 记下与服务帐户关联的电子邮件地址。
  4. 与此电子邮件地址共享(通过日历用户界面)任何必要的日历。
  5. 安装Google API Java客户端库( https://developers.google.com/api-client-library/java/apis/ )。

然后你应该能够使用以下代码:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.json.gson.GsonFactory; import java.io.File; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import java.util.Arrays; import com.google.api.services.calendar.Calendar; GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport()) .setJsonFactory(new GsonFactory()) .setServiceAccountId("@developer.gserviceaccount.com") .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly")) .setServiceAccountPrivateKeyFromP12File(new File("-privatekey.p12")) .build(); Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build(); client..execute(); 

如果您是域管理员,需要在未经个别用户同意的情况下访问属于您域的所有Google Apps帐户的日历,则代替上述步骤4:

  1. 记下与服务帐户关联的客户端ID。 这可以在client_secrets.json文件中找到 – 通常以1234.apps.googleusercontent.com的forms。
  2. 授权此客户端代表您组织中的用户发出请求。 有关步骤,请参阅https://support.google.com/a/answer/162106?hl=zh-CN – 使用稍后要求的范围。

您现在应该能够编写如下代码:

 import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.json.gson.GsonFactory; import java.io.File; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import java.util.Arrays; import com.google.api.services.calendar.Calendar; GoogleCredential credentials = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport()) .setJsonFactory(new GsonFactory()) .setServiceAccountId("@developer.gserviceaccount.com") .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar")) .setServiceAccountPrivateKeyFromP12File(new File("-privatekey.p12")) .setServiceAccountUser("@yourdomain.com") .build(); Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build(); client.()