6

Sto provando a connettermi a un calendario utilizzando l'API di Google Calendar di Java. L'applicazione java utilizza un account di servizio.Java Google Calendar api "access_denied" sull'account del servizio

Sono il seguente codice:

java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12"); 

    GoogleCredential credential = new GoogleCredential.Builder() 

    .setTransport(HTTP_TRANSPORT) 
    .setJsonFactory(JSON_FACTORY) 
    .setServiceAccountId("[email protected]") 
    .setServiceAccountUser(EMAIL_ADRESS) 
    .setServiceAccountScopes(CalendarScopes.CALENDAR) 
    .setServiceAccountPrivateKeyFromP12File(licenseFile) 
    .build(); 

    client = new com.google.api.services.calendar.Calendar.Builder(
         HTTP_TRANSPORT, JSON_FACTORY, credential) 
         .setApplicationName("Google Calendar Sync").build(); 

    Calendar calendar = client.calendars().get(EMAIL_ADRESS).execute(); 

Sull'ultima riga ottengo un IOException con il messaggio:

ex = (com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request { "error" : "access_denied" }

ho Dubble controllato i valori per l'oggetto GoogleCredential e sono corrette . Ho anche aggiunto https://www.google.com/calendar/feeds/, http://www.google.com/calendar/feeds/ nella mia console di dominio con l'id dell'applicazione come client per autorizzare l'accesso di applicazioni di terze parti

sto dimenticando un passaggio?

+0

Ciao, hai capito? Lo sto provando con scope gmail ma sto ottenendo lo stesso errore .. – zhywu

+0

Ho aggiornato con la risposta;) –

+0

Grazie, l'account di servizio non sembra funzionare per gmail – zhywu

risposta

1

l'API non è ancora finito. Più in particolare la parte dell'account di servizio.

Il proprietario del calendario deve autorizzare l'applicazione a leggere/scrivere il calendario nelle impostazioni del calendario. Si trova nelle impostazioni di condivisione del calendario, lì puoi aggiungere gli indirizzi e-mail degli account e dare loro l'autorizzazione sul tuo calendario.

Quindi, in questo caso, ho dovuto aggiungere: [email protected] all'elenco delle autorizzazioni/condivisioni dei calendari a cui l'applicazione aveva bisogno di accedere.

Ho eliminato anche un altro post che non ha funzionato a causa del problema sopra riportato. Lo ripristinerò poiché contiene alcuni frammenti di codice che potrebbero aiutare altre persone in futuro. Ma i problemi di autorizzazione e gli account di servizio non supportano Google Calendar

+0

Ciao Stephan, Hai detto che "gli account di servizio non supportano Google Calendar", quindi non possiamo usare l'account di servizio per recuperare gli eventi del calendario di Google di qualcuno anche se lei/lui/amministratore ci ha concesso il permesso? – Jack

0

ho preso a lavorare

Non so perché, ma ho cancellato la linea

.setServiceAccountUser(EMAIL_ADRESS) 

Inoltre ho aggiunto un URL in più nel campo di applicazione del dominio:

https://apps-apis.google.com/a/feeds/calendar/resource/#readonly 

e cancellato un collegamento che non funzionava.

Infine ho cambiato l'applicationName nella mia dichiarazione di cliente per lo stesso nome nella console api

client = new com.google.api.services.calendar.Calendar.Builder(
         HTTP_TRANSPORT, JSON_FACTORY, credential) 
         .setApplicationName("HolidaySyncs").build(); 

Dopo queste operazioni ha cominciato a lavorare.

notare anche per riferimento futuro dopo che ho fatto questo ho avuto il seguente errore:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "notFound", 
    "message": "Not Found" 
    } 
    ], 
    "code": 404, 
    "message": "Not Found" 
} 
} 

Ho risolto questo modificando ad esempio:

Event result = client.events().insert(<EMAIL ADRESS>, event).execute(); 

a

Event result = client.events().insert("primary", event).execute(); 

First Pensavo che ci fosse qualcosa di sbagliato nei server di google, ma a quanto pare va male quando ci provi per collegare a un ID di calendario. Quindi il collegamento a "primario" che è il calendario principale di un account funziona. Ma secondo la documentazione dovrebbe funzionare anche quando si fa riferimento a un ID calendario specifico, in cui l'indirizzo e-mail è il calendario principale. Probabilmente un bug?

AGGIORNAMENTO: dopo questa correzione del codice ho ancora avuto problemi. Leggi la risposta accettata per maggiori informazioni.

0

faccio:

List find = client.events().list(EMAIL_ADRESS); 
DateTime timeMin = new DateTime(DateUtil.stringToDate("01/01/2013")); 
DateTime timeMax = new DateTime(DateUtil.stringToDate("01/02/2013")); 

find.setTimeMin(timeMin); 
find.setTimeMax(timeMax); 

    try{ 
     Events events = find.execute(); 
     int i =0; 

     while (true) { 
      System.out.println("Page: "+(++i)+": "+events.getItems().size()); 
     for (Event event : events.getItems()) { 
      System.out.println(event.getSummary()); 
     } 
     String pageToken = events.getNextPageToken(); 
     if (pageToken != null && !pageToken.isEmpty()) { 
      events = client.events().list(EMAIL_ADRESS).setPageToken(pageToken).execute(); 
     } else { 
      break; 
     } 
     } 

     }catch(GoogleJsonResponseException e){ 
      System.out.println(e.getMessage()); 
//   e.printStackTrace(); 
     } 
Problemi correlati