"Login erforderlich" 401 Nicht autorisierte Nachricht beim Aufrufen der Google Kalender-API von Version 3 unter Verwendung eines Dienstkontos über OAuth 2.0
Lassen Sie mich zunächst erklären, was ich zu tun versuche, da dies eine zweiteilige Frage ist.
Ich erstelle einen JAX-RS-Dienst, der sich intern über OAuth2 bei einem Google-Konto authentifiziert, damit er auf einen Google-Kalender zugreifen und diesen bearbeiten kann. Dieser Dienst wird von einer Website (Joomla) aufgerufen, auf der Benutzer, die sich auf der Website anmelden, ihre E-Mail-Adresse für Kalenderereignisse registrieren können, um E-Mail-Benachrichtigungen zu erhalten, wenn die Ereignisse in der Nähe sind. Diese Nutzer haben keine Kenntnis über das zugrunde liegende Google-Konto.
Meine erste Frage lautet also: Ist die Verwendung der Service Account-Authentifizierung das Richtige? Betrachtet man die Google-Dokumente, so ist dies der einzige Anwendungsfall, der eine nichtmenschliche Authentifizierung ermöglicht (also eine Server-zu-Server-Authentifizierung).
Das zweite Problem ist, dass ich dazu Code geschrieben habe, aber ich erhalte eine 401 / Unauthorized-Antwort mit dem folgenden Fehler zurück, wenn ich die execute-Methode als Kalenderfeed bezeichne. Dieser Code wurde aus den Google-Beispielen entfernt.
Ich verwende v3-rev3-1.5.0-beta der Google Kalender-API. Ich habe die Kalender-API im Konto aktiviert und einen privaten Schlüssel erstellt und heruntergeladen, der im folgenden Code verwendet wird.
Ich rufe den folgenden Code in Eclipse lokal auf, nicht von einem Webserver.
Der erste Aufruf, den ich mache, besteht darin, ein Berechtigungsnachweisobjekt zurückzugewinnen (IDs sind mit X-Zeichen verdeckt):
<code>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("[email protected]") .setServiceAccountScopes(CalendarScopes.CALENDAR) .setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12")) .build(); </code>
Der nächste Schritt besteht darin, die Kalender-API wie folgt aufzurufen (kein anderer Code, der dazwischen aufgerufen wird):
<code> Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY) .setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential) .build(); CalendarList feed = calendar.calendarList().list().execute(); </code>
Der Aufruf von list (). Execute () führt zu folgendem Fehler:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized {"code": 401, "errors": [{"domain": "global", "location": "Authorization", "locationType": " header "," message ":" Login erforderlich "," reason ":" required "}]," message ":" Login erforderlich "} at com.google.api.client.googleapis.json.GoogleJsonResponseException.from (GoogleJsonResponseException. Java: 159) bei com.google.api.client.googleapis.json.GoogleJsonResponseException.execute (GoogleJsonResponseException.java:187) bei com.google.api.client.googleapis.services.GoogleClient.executeUnparsed (GoogleClient.executeUnparsed). at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed (JsonHttpRequest.java:112) at com.google.api.services.calendar.Calendar $ CalendarList $ List.execute (Calendar.java:510) at uk .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents (Service.java:55) unter uk.org.reigatepriorybowmen.Service.main (Service.java:74)
Das Dienstkonto wird wie folgt eingerichtet:
Also, was mache ich falsch ?! Ich habe Stunden damit verbracht, herumzugoogeln, um nach Lösungen zu suchen, also ist dies meine letzte Hoffnung.
Vielen Dank im Voraus für Ihre Hilfe.
Justin