web-dev-qa-db-ja.com

Googleカレンダーにアクセスする方法REST API v3 with Java

RESTを使用して一連のGoogleカレンダーにアクセスし、Javaを使用する必要があるプロジェクトに取り組んでいます。

Google以外のプライベートサーバー上にあるプログラムは、定期的に(cronジョブを介して)Googleアカウントに接続し、アカウントにリンクされているカレンダーのリストを取得し、各カレンダーの先月のイベントを取得して、すべてを含むXMLファイルを返します。情報。プログラムは、ユーザー入力なしでカレンダーを実行およびアクセスできる必要があります。現時点では、プロジェクトはカレンダーが変更されずに読み取られることを指定しています(したがって、GET/LIST呼び出しのみが行われます)。

Googleのドキュメントを確認し、クライアントライブラリを使用してサンプルコードを確認しました。記載されているほとんどすべての例では、カレンダーAPIにアクセスする前にOAuth2.0ユーザーの同意が必要です。 REST AP​​Iドキュメントページでさえ、要求された情報を返すためにOAuth 2.0をアクティブ化する必要があります(そうでない場合は、HTTP 40Xエラーコードとエラーステータスとメッセージを含むJSONファイルを返します)。

GoogleカレンダーREST AP​​Iに接続して、必要な情報を取得するにはどうすればよいですか。すべてはREST呼び出しを介して行われ、実行時にユーザーの同意は必要ありません。

または、物事を複雑にしすぎて、Google CloudConsoleのResgisteredApps部分にある「サーバーキー」のみが必要ですか?
または、OAuthと開発者キーの両方を使用する必要がありますか? (誰かがここで「GoogleCalendar API v3ハードコードされた資格情報」というタイトルの質問の下でそれについて言及しているのを見つけました;しかし、質問と解決策はPHPに関するものであり、Javaで同様のことが可能または必要かどうかはわかりません)。

  • サービスアカウント(Googleクラウドコンソールを使用し、Webアプリケーションとして登録し、「証明書」の下にあります)でJWTを作成する可能性はありましたが、これを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 )が、ユーザーの同意ページを使用せずに使用する方法を確認できませんでした。
  • 「2本足のOAuth」への参照をいくつか見ました。しかし、これはOAuth 2.0ではないようですが、バージョン1は何かをしていました。それは私のプロジェクトの可能な解決策ですか?もしそうなら、それを機能させるためにGoogle Cloud Consoleからどのような情報が必要ですか?

私が探しているものについて十分な情報を提供したこと、そしてこの質問がこれまでカバーされていないことを願っています。調べてみましたが、探していたものに近いものは見つかりませんでした。

2つ以上のリンクを投稿できませんでした(評判が不足しています)が、Google Calendar v3 REST AP​​Iと、JWTの作成を指定するページを確認しました。

11
AntonH

特定のカレンダーのセットにアクセスする必要がある場合は、サービスアカウントを作成し、必要なカレンダーをそのアカウントと共有します。

そうするために:

  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("<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>()
10
aeijdenberg