まず、これは 2 つの部分からなる質問なので、私がやろうとしていることを説明させてください。
Googleカレンダーにアクセスして操作できるように、OAuth2を介してGoogleアカウントで内部認証するJAX-RSサービスを構築しています。このサービスは Web サイト (Joomla) によって呼び出され、サイトにログインしたユーザーはカレンダー イベントに電子メール アドレスを登録できるため、イベントが近づいたときに電子メール通知を受け取ることができます。これらのユーザーは、基になる Google アカウントについて何も知りません。
私の最初の質問は、サービス アカウント認証を使用することは正しいことですか? Google ドキュメントを見ると、人間以外の認証 (つまり、サーバー間認証) に対応する唯一のユース ケースです。
2 つ目の問題は、これを行うコードを書いたのですが、カレンダー フィードの execute メソッドを呼び出すと、401/Unauthorized 応答が返され、次のエラーが返されることです。このコードは、Google のサンプルから削除されました。
Google Calendar API の v3-rev3-1.5.0-beta を使用しています。アカウントで Calendar API を有効にし、以下のコードで使用される秘密鍵を作成してダウンロードしました。
Web サーバーからではなく、Eclipse で以下のコードをローカルで呼び出しています。
したがって、最初に行う呼び出しは、資格情報オブジェクトを取得することです (ID は X で難読化されています)。
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
.
.
.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("284XXXXXXXX@developer.gserviceaccount.com")
.setServiceAccountScopes(CalendarScopes.CALENDAR)
.setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12"))
.build();
次のステップは、次のように Calendar API を呼び出すことです (その間に他のコードは呼び出されません)。
Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
.build();
CalendarList feed = calendar.calendarList().list().execute();
list().execute() を呼び出すと、次のエラーが発生します。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code": 401, "errors": [ { "domain": "global", "location": "Authorization", "locationType": " header", "message" : "ログインが必要です", "reason" : "required" } ], "message" : "Login Required" } at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException. java:159) com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187) で com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) でcom.google.api.client.http.json で。uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java: 55) uk.org.reigatepriorybowmen.Service.main(Service.java:74) で
サービス アカウントは次のように設定されます。
それで、私は何を間違っていますか?私は何時間もグーグルで解決策を探してきたので、これが私の最後の希望です.
ご協力いただきありがとうございます。
ジャスティン