代码之家  ›  专栏  ›  技术社区  ›  Yeronimo

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

  •  4
  • Yeronimo  · 技术社区  · 6 年前

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

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

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

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

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

    我进入G套件安全模块,进入ManageAuthClients页面,输入ID并选择google日历API( https://www.googleapis.com/auth/calendar )

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

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

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

    现在,我为Google添加了nuget包和日历API,并在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 回复  |  直到 6 年前
        1
  •  1
  •   Yeronimo    6 年前

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

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

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

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

        2
  •  0
  •   ScottMcC    6 年前

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

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

    1. 转到生成的JSON密钥文件。您可以通过查看 client_id 键值对
    2. 在云控制台中,转到IAM&管理->服务帐户。最后一列应为 Options 。如果已为帐户设置了域范围委派(DwD),则应单击 View Client ID 这会将您带到另一个屏幕,在那里您可以查看您的客户ID。