Google 服务帐户未获得日历 API 的授权

Google service account not being authorized for calendar API

我正在尝试通过服务帐户连接到我们 G Suite 域中的所有日历。

我创建了一个新项目并在 API 和服务页面中启用了 Google 日历 API。

我创建了一个 Google 服务帐户:

在服务账户管理页面我取了我的ID (AAA@BBB.iam.gserviceaccount.com)

我进入了 G Suite 安全模块并进入了 ManageOauthClients 页面,在那里我输入了 ID 并选择了 google 日历 API (https://www.googleapis.com/auth/calendar)

它正确识别了我的ID并添加了:

1234567890 日历(读写)https://www.googleapis.com/auth/calendar

其中 1234567890 是 Google 从我的 AAA@BBB.iam.gserviceaccount.com 输入中获取的 ID。

现在我为 Google 和日历 API 添加了 nuget 包,并在 C# 的命令行应用程序中编写了以下代码:

        var scopes = new[] { CalendarService.Scope.Calendar };

        ServiceAccountCredential credential;

        using (Stream stream = new FileStream("ToprServiceAccount-xxxxyyyyy.json", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            credential = GoogleCredential.FromStream(stream).CreateScoped(scopes).UnderlyingCredential as ServiceAccountCredential;
        }

        var service = new CalendarService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential
        });

        var list = service.CalendarList.Get("planning@mydomain.com").Execute();

我确定我要求的日历存在。这是我实际执行上述所有步骤时使用的帐户。

但我仍然收到 404 错误,这意味着很可能我没有访问(我自己的)日历的权限。

会不会跟角色有关?我不确定在创建服务帐户时选择什么角色。

同样,当只是试图获取所有日历的列表时,它是一个空列表。

我想说的是检查您是否为 G Suite 中的 ManageOauthClients 部分使用了正确的客户端 ID。服务帐户电子邮件中的 ID 应与您需要使用的客户端 ID 不同。

您可以通过两种方式确认您拥有正确的客户端 ID:

  1. 转到生成的 JSON 密钥文件。您可以通过查看 client_id 键值对
  2. 来获取客户端 ID
  3. 在 Cloud Console 中,转到 IAM 和管理 -> 服务帐户。最后一列应该是 Options。如果您为帐户配置了域范围委派 (DwD),您应该单击 View Client ID,这会将您带到另一个屏幕,您可以在其中查看您的客户端 ID。

我发现出了什么问题(来源:https://neal.codes/blog/google-calendar-api-on-g-suite/

在 G-Suite -> 应用程序 -> 日历 -> 常规设置中,我必须启用共享所有日历的选项,外人可以更改日历

进入任何日历并与服务帐户电子邮件共享日历后。根据我在问题中的示例,那将是 AAA@BBB.iam.gserviceaccount.com。

这两个步骤据我所知没有在文档中提及。很高兴我现在可以使用它了!