簡體   English   中英

如何使用 Java 訪問 Google Calendar REST API v3

[英]How to Access Google Calendar REST API v3 with Java

我正在開發一個項目,在該項目中我必須使用 REST 並使用 Java 訪問一組 Google 日歷。

該程序位於私人非 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 Cloud Console 的注冊應用程序部分中找到的“服務器密鑰”?
還是我需要同時使用 OAuth 和開發人員密鑰? (我發現有人在這里提到了一個標題為:Google Calendar API v3 hardcoded credentials 的問題;但是,問題和解決方案是針對 PHP 的,我不知道在 Java 中是否可能或需要類似的東西)。

  • 我確實看到了使用服務帳戶創建 JWT 的可能性(使用 Google 雲控制台,注冊為 Web 應用程序,並且它在“證書”下),但是我沒有找到如何將它與來自的 REST 調用結合使用一個Java程序。
  • 以下鏈接 ( http://aleksz-programming.blogspot.be/2012/11/google-calendar-api.html ) 表示可以通過“網絡服務器應用程序”或“已安裝的應用程序”訪問信息,但不能不細說。 但是,在 Google OAuth 2.0 文檔頁面上,“Web 服務器應用程序”部分仍然需要用戶輸入和同意。 哪個是真的?
  • 我也找到了這個頁面( https://developers.google.com/accounts/docs/OAuth2Login ),但沒有看到如何在不使用用戶同意頁面的情況下使用它。
  • 我確實看到了一些對“2-legged OAuth”的引用。 但似乎這不是一個 OAuth 2.0,而是一個版本 1 的服務器。 這是我的項目的可能解決方案嗎? 如果是這樣,我需要從 Google Cloud Console 獲取哪些信息才能使其正常工作?

我希望我已經提供了關於我正在尋找的內容的足夠信息,並且到目前為止還沒有涉及到這個問題。 我確實研究過它,但沒有找到與我想要的東西足夠接近的東西。

我無法發布超過 2 個鏈接(缺乏聲譽),但確實查看了 Google Calendar v3 REST API,以及指定創建 JWT 的頁面。

如果您只需要訪問一組特定的日歷,我會創建一個服務帳戶並與該帳戶共享必要的日歷。

這樣做:

  1. 在此 Cloud Console 中創建一個“服務帳戶”(位於“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("<service account email address>@developer.gserviceaccount.com")
  .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly"))
  .setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff>.execute();

相反,如果您是域管理員,需要在未經個人用戶同意的情況下訪問屬於您域的所有 Google Apps 帳戶的日歷,那么請不要執行上述第 4 步:

  1. 記下與服務帳戶關聯的客戶端 ID。 這可以在 client_secrets.json 文件中找到 - 通常采用 1234.apps.googleusercontent.com 的形式。
  2. 授權此客戶端代表您組織中的用戶提出請求。 有關步驟,請參閱https://support.google.com/a/answer/162106?hl=en - 使用您稍后將請求的任何范圍。

您現在應該能夠編寫如下代碼:

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("<service account email address>@developer.gserviceaccount.com")
  .setServiceAccountScopes(Arrays.asList("https://www.googleapis.com/auth/calendar"))
  .setServiceAccountPrivateKeyFromP12File(new File("<private key for service account in P12 format>-privatekey.p12"))
  .setServiceAccountUser("<domain user whose data you need>@yourdomain.com")
.build();
Calendar client = new Calendar.Builder(GoogleNetHttpTransport.newTrustedTransport(), new GsonFactory(), credentials).build();
client.<do calendar stuff as that user>()

除了@aeijdenberg 的回答中提到的步驟之外,服務帳戶現在需要通過 CalendarList.insert 將共享日歷添加到其 CalendarList 來明確接受共享日歷。 見:

服務帳戶不再接受自動共享日歷 [148804709] https://issuetracker.google.com/issues/148804709

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM