C# 未授权使用日历API的Google服务帐户

C# 未授权使用日历API的Google服务帐户,c#,google-api,google-authentication,google-workspace,C#,Google Api,Google Authentication,Google Workspace,我正在尝试通过服务帐户连接到我们的G套件域上的所有日历 我创建了一个新项目,并在API和服务页面中启用了Google日历API 我创建了一个Google服务帐户,其中包含: 名字 似乎适用的角色 生成的json密钥文件 为整个域启用G套件 在服务帐户管理页面中,我使用了我的ID(AAA@BBB.iam.gserviceaccount.com) 我进入G套件安全模块,进入ManageAuthClients页面,输入ID并选择google日历API() 它正确识别了我的ID并添加: 123456

我正在尝试通过服务帐户连接到我们的G套件域上的所有日历

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

我创建了一个Google服务帐户,其中包含:

  • 名字
  • 似乎适用的角色
  • 生成的json密钥文件
  • 为整个域启用G套件
在服务帐户管理页面中,我使用了我的ID(AAA@BBB.iam.gserviceaccount.com)

我进入G套件安全模块,进入ManageAuthClients页面,输入ID并选择google日历API()

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

1234567890日历(读写)

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

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

我确保我要的日历存在。这是我用来实际执行上述所有步骤的帐户中的一个

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

这可能与角色有关吗?我不确定创建服务帐户时要选择什么角色


另外,在尝试获取所有日历的列表时,它是一个空列表。

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

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

  • 转到生成的JSON密钥文件。您可以通过查看
    客户机ID
    键值对来获取客户机ID
  • 在云控制台中,转到IAM&admin->Service Accounts。最后一列应该是
    选项
    。如果您已为帐户设置了域范围的委派(DwD),则应单击“查看客户端ID”,这会将您带到另一个屏幕,在那里您可以查看客户端ID

  • 我发现了哪里出了问题(来源:)

    在G-Suite->Apps->Calendar->General settings中,我必须启用共享所有日历的选项,外部人员可以更改日历

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


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

    我检查了两个,它们匹配。还验证了ManageAuthClients部分中的设置是否正确
            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();