google-api - 无法通过服务帐户访问 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
以便它可以完全访问项目中的设置。
我确信这对我的服务帐户配置来说是一件小而简单的事情,但我一生都无法弄清楚它是什么。
解决方案
所以我设法自己解决了这个问题。似乎我的服务帐户设置正确,但我添加的权限没有。为了记录,这就是我想要的:
- 获得对日历的只读访问权限。
- 能够检索我组织中任何用户的日历。
我已经创建了服务帐户,确保它具有域范围委派授权,将日历和管理 API 添加到我持有服务帐户的项目中,但是如果不将我的服务帐户添加到每个 @ 的日历中,我就无法让它工作上面亚历克斯巴班的信息。
我回到绘图板上,因为将其添加到几十个帐户并不是一个理想的解决方案,然后我找到了它。我必须为我的服务帐户添加以下授权:
- https://www.googleapis.com/auth/admin.directory.resource.calendar
- https://www.googleapis.com/auth/calendar.events.readonly
- https://www.googleapis.com/auth/calendar.readonly
希望这可以帮助其他人在未来。
推荐阅读
- filebeat - 如何禁用 filebeat 的 close_inactive 设置?
- c# - 当我点击谷歌对话流的端点但相同的谷歌对话流端点在邮递员中工作时,在 C# 中出现错误
- java - 将完整文件编码为 base64(不仅是内容)
- java - 如何用新数据替换arraylist中的现有元素
- python - 使用布尔值 AND 计算字符串在行中的出现次数
- vba - 查找单元格为空白时删除图像
- docker - CloudFoundry 上 docker 容器的健康检查失败:没有这样的文件或目录
- angular - 无法使用 angular-cli 在 2 个本地应用程序之间执行 http post/get 请求
- php - sql 无法通过 mysqli_multi_query 执行
- c++ - Microsoft/CppRestSDK 卡萨布兰卡,Visual Studio 2017