Innanzitutto, vorrei spiegare cosa sto cercando di fare, poiché si tratta di una domanda in due parti."Accesso richiesto" 401 Messaggio non autorizzato quando si chiama l'API di Google Calendar v3 utilizzando un account di servizio tramite OAuth 2.0
Sto costruendo un servizio JAX-RS che si autentica internamente con un account Google tramite OAuth2, quindi può accedere e manipolare un calendario di Google. Questo servizio verrà chiamato da un sito Web (Joomla), che consentirà agli utenti che accedono al sito di registrare il proprio indirizzo email con gli eventi del calendario in modo che possano ricevere notifiche via email quando gli eventi sono vicini. Questi utenti non sono a conoscenza dell'account Google sottostante.
Quindi la mia prima domanda, sta usando l'autenticazione dell'account di servizio la cosa giusta? Guardando i documenti di Google, è l'unico caso d'uso che si rivolge all'autenticazione non umana (quindi all'autenticazione da server a server).
Il secondo problema è che ho scritto del codice per fare questo, ma torno indietro 401/La risposta non autorizzata indietro il seguente errore quando chiamo il metodo di esecuzione il feed del calendario. Questo codice è stato rimosso dagli esempi di Google.
Sto utilizzando v3-rev3-1.5.0-beta dell'API di Google Calendar. Ho attivato l'API Calendar nell'account e creato e scaricato una chiave privata, utilizzata nel codice seguente.
Sto chiamando il codice qui sotto in Eclipse localmente, non da un server web.
Quindi la prima chiamata che faccio è quello di tornare un oggetto credenziale (di Id offuscato con X di):
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();
Il passo successivo è quello di poi chiamare l'API calendario, in questo modo (nessun altro codice chiamato in tra):
Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
.build();
CalendarList feed = calendar.calendarList().list().execute();
la chiamata di elencare() execute() genera il seguente errore:.
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)
L'account di servizio è configurato come segue:
Allora, che cosa faccio di sbagliato ?! Ho passato ore a cercare su Google in cerca di soluzioni, quindi questa è la mia ultima speranza.
Molte grazie in anticipo per il vostro aiuto.
Justin
hai mai trovato la soluzione a questo? –