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

时间:2018-03-24 14:39:21

标签: c# google-api google-authentication gsuite

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

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

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

  • 姓名
  • 似乎适用的角色
  • 生成的json密钥文件
  • 为整个域启用G Suite

在服务帐户管理页面,我拿了我的身份证(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和Calendar 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 个答案:

答案 0 :(得分:1)

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

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

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

这两个步骤是我在文档中没有提到的。很高兴我现在就开始工作了!

答案 1 :(得分:0)

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

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

  1. 转到生成的JSON密钥文件。您可以通过查看client_id键值对
  2. 来获取客户端ID
  3. 在云端控制台中,转到IAM& admin - >服务帐户。最后一列应为Options。如果您为该帐户配置了域范围广泛授权(DwD),则应该点击View Client ID,这会将您带到另一个可以查看您的客户ID的屏幕。