Zuerst möchte ich erklären, was ich versuche, da dies eine zweiteilige Frage ist."Anmeldung erforderlich" 401 Unautorisierte Nachricht beim Aufruf der Google Kalender-API der v3 mit einem Dienstkonto über OAuth 2.0
Ich erstelle einen JAX-RS-Dienst, der sich intern mit einem Google-Konto über OAuth2 authentifiziert, damit er auf einen Google-Kalender zugreifen und ihn bearbeiten kann. Dieser Dienst wird von einer Website (Joomla) aufgerufen, die es Benutzern, die sich auf der Website anmelden, ermöglicht, ihre E-Mail-Adresse bei Kalenderereignissen zu registrieren, damit sie E-Mail-Benachrichtigungen erhalten, wenn die Ereignisse in der Nähe sind. Diese Nutzer kennen das zugrunde liegende Google-Konto nicht.
Also meine erste Frage, ist Service Account Authentifizierung die richtige Sache? Betrachtet man die Google-Dokumente, ist dies der einzige Anwendungsfall, der eine nicht-menschliche Authentifizierung ermöglicht (also Server-zu-Server-Authentifizierung).
Das zweite Problem ist, dass ich Code geschrieben habe, um dies zu tun, aber ich bekomme eine 401/nicht autorisierte Antwort zurück den folgenden Fehler zurück, wenn ich die execute-Methode den Kalender-Feed aufrufen. 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 Code unten in Eclipse lokal, nicht von einem Webserver.
So ist der erste Anruf, den ich machen, ist ein Credential-Objekt zurück (Id der mit X verschleierten):
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();
Der nächste Schritt ist, um dann die Kalender-API aufrufen, wie so (kein anderer Code genannt in between):
Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
.build();
CalendarList feed = calendar.calendarList().list().execute();
der Aufruf() zur Liste execute() ergibt folgende Fehler:.
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code" : 401, "errors" : [ { "domain" : "global", "location" : "Authorization", "locationType" : "header", "message" : "Login Required", "reason" : "required" } ], "message" : "Login Required" } at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187) at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) 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) at uk.org.reigatepriorybowmen.Service.main(Service.java:74)
Das Dienstkonto ist wie folgt aufgebaut:
Also, was mache ich falsch ?! Ich habe Stunden damit verbracht, nach Lösungen zu suchen. Das ist meine letzte Hoffnung.
Vielen Dank im Voraus für Ihre Hilfe.
Justin
haben Sie jemals die Lösung dafür gefunden? –