我编写了一个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 = '[email protected]';
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));
}
});
任何帮助将不胜感激:)
服务帐户的工作方式与普通帐户一样,它们拥有自己的权限,除非明确授予日历访问权限,否则它们无法访问日历的信息。
为了克服此问题,您可以:
将日历共享到您的服务帐户。您只需与任何普通用户共享它,尽管分配了服务帐户的电子邮件。
如果您使用的是G Suite(不是普通/消费者帐户),请使用Domain-Wide delegation。您可以在提供的超链接中了解更多信息。此功能使您可以“模拟”域的另一个用户,这不仅使您可以检索事件,还可以根据需要修改日历和事件,因为您对其拥有“所有者”权限。