如何通过服务帐户 (Google 日历 API) 获取资源日历的事件?

How do I get the events of a resource calendar via a service account (Google Calendar API)?

我写了一个 Node/Express 应用程序,想通过服务帐户访问资源日历中的事件。 当我使用我的个人日历时它工作正常但使用资源日历时它给我一个空白页。

这就是我必须做的。我必须更改什么才能使其正常工作?

let express = require('express');
let app = express();

let {google} = require('googleapis');
const calendar = google.calendar('v3');

const port = 3000;
const key = require('./credentials.json');

const jwtClient = new google.auth.JWT(
    key.client_email,
    null,
    key.private_key,
    [ 'https://www.googleapis.com/auth/calendar' ],
    null
);

jwtClient.authorize(function(err) {
    if (!err) {
        console.log("Authorization worked!");
    }
});

const calendarID = 'XXXXX@resource.calendar.google.com';

app.get('/', function(req, res) {
    calendar.events.list({
        auth: jwtClient,
        calendarId: calendarID,
        timeMin: (new Date()).toISOString(),
        maxResults: 2,
        singleEvents: true,
        orderBy: 'startTime'
    }, function(err, resp) {
        res.json(resp);
    });

});

app.listen(port, function(err){
    if (!err) {
        console.log("XXXXX is running on port", port);
    } else {
        console.log(JSON.stringify(err));
    }
});

任何帮助将不胜感激:)

服务帐户与普通帐户一样工作 - 它们有自己的权限,并且无法访问日历信息,除非明确授予它们访问权限。

为了解决这个问题,您可以:

  1. 将日历共享到您的服务帐户。您只需像与任何普通用户一样共享它,尽管分配服务帐户的电子邮件。

  2. 如果您使用的是 G Suite(不是 regular/consumer 帐户),请使用 Domain-Wide delegation。您可以在提供的超链接中了解更多信息。此功能允许您 "impersonate" 域的另一个用户,这样您不仅可以检索事件,还可以根据需要修改日历和事件,因为您对它拥有 "owner" 权限。