首页 > 解决方案 > 无法通过服务帐户访问 Google Calendar API

问题描述

我正在尝试通过 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值导致上面的响应。

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

我确信这对我的服务帐户配置来说是一件小而简单的事情,但我一生都无法弄清楚它是什么。

标签: google-apigoogle-calendar-apigoogle-oauthgoogle-oauth-java-client

解决方案


所以我设法自己解决了这个问题。似乎我的服务帐户设置正确,但我添加的权限没有。为了记录,这就是我想要的:

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

我已经创建了服务帐户,确保它具有域范围委派授权,将日历和管理 API 添加到我持有服务帐户的项目中,但是如果不将我的服务帐户添加到每个 @ 的日历中,我就无法让它工作上面亚历克斯巴班的信息。

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

希望这可以帮助其他人在未来。


推荐阅读