谷歌服务账户未被授权使用日历API

4
我正在尝试通过服务账户连接我们G Suite域上的所有日历。
我创建了一个新项目,并在API和服务页面中启用了Google日历API。
我创建了一个Google服务账户,其中包括:
- 名称 - 适用的角色 - 生成的JSON密钥文件 - 启用了整个域的G Suite 在服务账户管理页面中,我获取了我的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错误,这意味着很可能我没有权限访问(我的)日历。
这可能与角色有关吗?我不确定在创建服务帐户时应选择哪些角色。
此外,当尝试获取所有日历列表时,它是一个空列表。
2个回答

1

我找到了问题出在哪里(源代码在这里:https://neal.codes/blog/google-calendar-api-on-g-suite/

在 G-Suite -> 应用程序 -> 日历 -> 常规设置中,我需要启用分享所有日历和外部人员可以更改日历的选项。

然后进入任何一个日历,并与服务账户电子邮件共享该日历。根据我的问题示例,该电子邮件地址为 AAA@BBB.iam.gserviceaccount.com。

据我所知,这两个步骤在文档中没有提到。我很高兴现在它能够正常工作了!


0

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

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

  1. 转到生成的JSON密钥文件。您可以通过查看client_id键值对来获取客户端ID
  2. 在Cloud Console中,转到IAM和管理 ->服务帐户。最后一列应该是选项。如果您已为帐户提供域广泛委派(DwD),则应单击查看客户端ID,这将带您进入另一个屏幕,您可以在其中查看您的客户端ID。

我检查了两者,它们是匹配的。同时验证在ManageOauthClients部分中设置正确。 - Yeronimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接