Google 服务帐户无法列出日历?

Google service account unable to list calendars?

任何人都可以指出允许服务帐户访问 Google 日历的正确设置吗?

我们有一个 node.js 项目,旨在提供对它已被授予访问权限的 Google 日历的访问权限,但我们无法弄清楚为什么它看不到日历.

与此同时,我们能够尝试使用另一个在另一个环境中工作的不同帐户,这很有效,但问题是以前在该项目上工作的人都无法访问该项目的配置比较。

我们得到的问题帐户 response.data

{
  "kind": "calendar#calendarList",
  "etag": "\"p33k9lxxjsrxxa0g\"",
  "nextSyncToken": "COias9Pm4vUCEjxvdGurdXRob24tZGV2LXNlcnZpY2UxQG90YxxxdGhvbi1kZXYuaWFtLmdzZXJ2aWNlYWNxb3VudC5jb20=",
  "items": []
}

无论哪种方式,这都表明问题出在服务帐户的配置上,而不是代码本身,但无论如何都会共享代码:

import { Auth, calendar_v3 as calendarV3 } from 'googleapis';
const Calendar = calendarV3.Calendar;

async getCalendarApi () {
  const jwtClient = new Auth.JWT(
    this.keyConfig.clientEmail,
    undefined,
    this.keyConfig.privateKey.replace(/\n/g, '\n'),
    [
      'https://www.googleapis.com/auth/calendar.readonly',
      'https://www.googleapis.com/auth/calendar.events'
    ]
  );

  const calendarApi = new Calendar({
    auth: jwtClient
  });

  await jwtClient.authorize();

  return calendarApi;
}

async init () {
  // loads the configuration from our app's configuration file
  this.keyConfig = getKeyConfig('google-calendar');
  
  const calendarApi = await this.getCalendarApi();
  const response = await calendarApi.calendarList.list();
  console.log(JSON.stringify(response.data, undefined, 2));
}

至于服务帐户,在 Google 控制台中,它是这样设置的:

通过上述步骤,我们将 client_emailprivate_key 字段值提供给我们的 nodejs 应用程序的用户。

然后在我们希望它访问的日历中,我们将服务帐户的电子邮件地址添加为查看者。

尝试以上所有方法仍然会导致服务帐户可见的日历列表为空。

有什么想法吗?

根据您的解释和返回值,我担心在您的情况下,您可能从未使用服务帐户插入共享日历。如果我的理解是正确的,下面的修改怎么样?

修改点:

  1. 将共享日历插入服务帐户。

    • 这种情况下,请将范围https://www.googleapis.com/auth/calendar.readonly修改为https://www.googleapis.com/auth/calendar

        async init () {
          // loads the configuration from our app's configuration file
          this.keyConfig = getKeyConfig('google-calendar');
      
          const calendarApi = await this.getCalendarApi();
          const response = await calendarApi.calendarList.insert({resource: {id: "###@group.calendar.google.com"}}); // Please set the Calendar ID here. Or {requestBody: {id: "###@group.calendar.google.com"}}
          console.log(JSON.stringify(response.data, undefined, 2));
        }
      
  2. 使用您的脚本检索日历列表。

    • 使用上述脚本将日历插入服务账号后,即可在日历列表中获取到共享日历。

参考: