6

我正嘗試使用Java Google日曆api連接到日曆。 Java應用程序使用服務帳戶。服務帳戶上的Java Google日曆api「access_denied」

我有下面的代碼:

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

在最後一行我得到一個IOException與消息:

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

我DUBBLE檢查值的GoogleCredential對象,它們是正確的。 我還添加了https://www.google.com/calendar/feeds/http://www.google.com/calendar/feeds/在我的域名控制檯應用程序ID爲客戶授權第三方應用訪問

我忘記了一步?

+0

嗨,你有沒有得到它的工作?我使用Gmail範圍嘗試,但得到了同樣的錯誤.. – zhywu

+0

我的答案更新;) –

+0

謝謝,服務帳戶似乎並不適用於Gmail工作 – zhywu

回答

1

的API還沒有完成。更具體地說是服務帳戶部分。

日曆所有者需要授予應用程序在其日曆設置中讀取/寫入日曆的權限。它可以在日曆的共享設置中找到,您可以在其中添加帳戶的電子郵件地址並在日曆上授予他們權限。

因此,在這種情況下,我不得不補充:[email protected]到應用程序需要訪問的日曆的許可/共享列表。

我也刪除了另一篇文章,上面並沒有因爲該問題的全面工作。我會取消刪除它,因爲它包含一些可能在未來幫助其他人的代碼段。但beaware的權限問題和服務帳戶不支持谷歌日曆

+0

嗨斯蒂芬, 你說的「服務帳戶不支持谷歌日曆」,所以我們不能用服務帳戶檢索,即使她/他/管理已授予許可給我們一個人的谷歌日曆事件? – Jack

0

我得到它的工作

我不知道爲什麼,但我刪除

.setServiceAccountUser(EMAIL_ADRESS) 

我也加入了域範圍的額外URL行:

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

和刪除了一個不起作用的鏈接。

最後我改變了的applicationName在我的客戶聲明相同的名稱,在API控制檯

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

這些步驟之後就開始工作。

還要注意以供將來參考我這樣做,我有以下錯誤後:

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

我解決了這個改變,例如:

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

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

第一我想Google服務器出了問題,但顯然當你嘗試時出錯鏈接到日曆ID。因此,鏈接到作爲帳戶主要日曆的「主要」工作。但根據文檔,當您引用特定的日曆ID時,它應該也可以工作,其中電子郵件地址是主日曆。可能是一個錯誤?

更新:這些代碼更正後,我仍然有問題。閱讀接受的答案以獲取更多信息。

0

我做的:

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(); 
     } 
相關問題