无法通过服务帐户访问Google Calendar API

时间:2019-05-30 18:22:28

标签: google-api google-calendar-api google-oauth google-oauth-java-client

我正在尝试通过Java中的简单POST调用来检索自己的忙/闲日历,并且遇到访问错误。基本上我遇到了404,notFound这样的错误:

{
 "kind": "calendar#freeBusy",
 "timeMin": "2019-05-28T13:00:00.000Z",
 "timeMax": "2019-05-28T21:00:00.000Z",
 "calendars": {
  "me@mycompany.com": {
   "errors": [
    {
     "domain": "global",
     "reason": "notFound"
    }
   ],
   "busy": []
  }
 }
}

代码相当简单。如果我使用OAuth Playground的不记名令牌,就可以得到所需的一切,一切都很好。这是我的相关代码:

        ClassLoader classLoader = getClass().getClassLoader();
        File file = new File(Objects.requireNonNull(classLoader.getResource("...a59.json")).getFile());

        GoogleCredential credential = GoogleCredential
                .fromStream(new FileInputStream(file))
                .createScoped(CalendarScopes.all());

        credential.refreshToken();
        String accessToken = credential.getAccessToken();

我得到的accessToken值导致上述响应。

对于我的服务帐户,我已经在启用Calendar API的项目中创建了该帐户。我还授予了它Project Owner的角色,以便它可以完全访问项目中的设置。

我确定使用“服务帐户”配置这是一件小事,但是我一生都无法弄清楚它是什么。

2 个答案:

答案 0 :(得分:1)

您还需要一步。

您将需要与服务帐户共享日历。

打开使用文本编辑器创建服务帐户时下载的something-something.json文件,您会找到所需的电子邮件地址,作为“ client_email”键/值对的值。

转到日历中的“设置和共享”,然后单击“与特定人员共享”下的“ +添加人员”按钮。


您可能已经做到了,但是对于其他人,以下是使用服务帐户访问Google日历的完整过程:(allow my user to add meeting in my calendar with Google Calendar API with PHP without auth

答案 1 :(得分:0)

所以我设法自己弄清楚了这一点。似乎我的服务帐户设置正确,但是我添加的权限不正确。作为记录,这是我想要的:

  1. 获得对日历的只读访问权限。
  2. 能够检索我组织中任何用户的日历。

我已经创建了服务帐户,确保它具有“域范围委托”授权,已将Calendar和Admin API添加到了拥有该服务帐户的项目中,但是如果不将我的服务帐户添加到“ @Alex Baban上面的消息发送日历。

我回到了绘图板上,因为将其添加到几十个帐户中并不是一个理想的解决方案,然后我找到了它。我必须为我的服务帐户添加以下授权:

希望这可以帮助将来的其他人。