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(); 
     } 
相关问题