6

Próbuję połączyć się z kalendarzem za pomocą interfejsu API kalendarza Google Java. Aplikacja Java używa konta usługi.Aplikacja Java Kalendarz Google api "access_denied" na koncie usługi

Mam następujący kod:

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(); 

W ostatnim wierszu otrzymuję IOException z komunikatem:

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

I Dubble sprawdzonej wartości dla obiektu GoogleCredential i są poprawne . Dodałem również https://www.google.com/calendar/feeds/, w mojej konsoli domeny z identyfikatorem aplikacji jako klientem, aby autoryzować dostęp do aplikacji innej firmy

Czy zapomniałem o kroku?

+0

Witam, czy to działa? Próbuję go z zasięgiem Gmaila, ale otrzymuję ten sam błąd .. – zhywu

+0

Zaktualizowałem z odpowiedzią;) –

+0

Dzięki, konto usługi nie działa dla Gmaila – zhywu

Odpowiedz

1

API nie jest jeszcze zakończona. Dokładniej część konta usługi.

Właściciel kalendarza musi zezwolić aplikacji na odczyt/zapis kalendarza w ustawieniach kalendarza. Znajduje się w ustawieniach udostępniania kalendarza, tam możesz dodać adresy e-mail kont i dać im pozwolenie na kalendarz.

W tym przypadku musiałem dodać: [email protected] do listy uprawnień/udziałów kalendarzy, do których aplikacja potrzebuje dostępu.

Usunąłem również inny wpis, który nie spowodował pełnej pracy z powodu powyższego problemu. Usunę go, ponieważ zawiera fragmenty kodu, które mogą pomóc innym osobom w przyszłości. Ale wiedząc o problemach z uprawnieniami i kontach usług nieobsługujących Kalendarza Google

+0

Witaj Stephan, Powiedziałeś, że "konta usług nie obsługują Kalendarza Google", więc czy nie możemy użyć konta usługi do pobrania czyichkolwiek wydarzeń z kalendarza Google, nawet jeśli ona/on/administrator udzielił nam pozwolenia? – Jack

0

Dostałem go do pracy

Nie wiem dlaczego, ale ja usunięte linię

.setServiceAccountUser(EMAIL_ADRESS) 

Również dodany dodatkowy url w zakresie domeny:

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

i usunięto link, który nie działał.

końcu zmienił ApplicationName w moim oświadczeniu klienta do tej samej nazwie jak w konsoli API

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

Po tych krokach zaczął działać.

Należy również pamiętać na przyszłość po tym, jak zrobił to miałem następujący błąd:

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

Rozwiązałem to zmieniając na przykład:

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

do

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

Pierwszej Pomyślałem, że coś jest nie tak z serwerami google, ale najwyraźniej źle się dzieje, gdy próbujesz aby połączyć z identyfikatorem kalendarza. Tak działa link do "podstawowego", który jest podstawowym kalendarzem konta. Ale zgodnie z dokumentacją powinna również działać, gdy odwołujesz się do określonego identyfikatora kalendarza, gdzie adres e-mail jest kalendarzem podstawowym. Prawdopodobnie błąd?

AKTUALIZACJA: po korekcie kodu nadal miałem problemy. Przeczytaj zaakceptowaną odpowiedź, aby uzyskać więcej informacji.

0

zrobić:

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(); 
     }