如何在 Node.js 中集成 Google 日历?
Google 开发者控制台提供了一个平台,可轻松集成 Google 提供的服务和工具,从而构建一流的应用程序。 Google 日历是这些服务之一,使用日历可以有利于提供功能,例如在待办事项列表应用程序或会议安排程序等项目中计划/创建事件。
在开发具有众多功能的项目时,开发人员的工作将变得更加容易,因为他们可以利用 API 来完成次要任务并真正专注于应用程序的目的。我们可以使用带有集成安全和日历模块的 Google Calendar API,而不是编写自己的逻辑来存储日历属性、用户权限和事件管理详细信息。我们将免于协调重叠事件、发送提醒、通知等的麻烦。
本文介绍了在 NodeJS 应用程序中集成 Google 日历 API 以及使用服务帐户身份验证创建新事件。我们的目标是将 Google 日历服务集成到 NodeJS 应用程序中。我们需要测试日历方法在我们的后端 NodeJS 应用程序中是否正常运行,并在出现错误凭据或缺少授予用户权限的情况下使用适当的错误处理机制。集成到该项目中的日历的 2 个功能是事件查看和添加事件。
方法:
- 我们将首先在谷歌开发者控制台上创建一个新的谷歌云项目。这是使用 Google Cloud 服务、管理 API 和权限以及控制项目协作者的开始步骤。
- 创建新项目后,下一步是启用 API。一个项目可以启用多个 API。我们只需要一个,那就是“ Google Calendar API ”。
- 现在我们需要了解身份验证和授权在 Google Workspace 中是如何工作的。首先,让我们修改这两个术语的定义。
- 身份验证:验证身份的过程。
- 授权:验证应用程序/用户是否可以访问某些资源。
- Google Workspace 提供 2 种身份验证类型:用户身份验证和应用身份验证。我们将使用应用身份验证,其中应用代表用户进行身份验证以使用 Google 服务。
我们为什么要使用“应用认证”?
- 由于我们的问题陈述是在 NodeJS 中集成日历服务,因此我们不会处理任何前端代码。通过应用身份验证,无需用户登录,我们的服务器将直接与 Google 服务器通信。
现在将如何验证我们的身份或如何进行身份验证?
- Google Workspace 中的身份验证需要“凭据”。凭证是一种“身份识别形式”,它将验证应用程序/用户的身份。
- 在 Google 提供的 3 个身份验证凭据(API 密钥、OAuth 2 同意、服务帐户)中,我们将使用“服务帐户”。服务帐户主要用于“服务器到服务器的交互”,如果需要,还可以扩展以访问用户数据。当我们有一个将直接与 Google 服务器通信的后端应用程序时,服务帐户很有用。
- 服务帐户将是属于我们的应用程序而不是用户的帐户。我们的应用程序将处理调用日历 API 的工作,而不直接涉及用户。
- 此帐户的凭据需要创建一个密钥,该密钥将以 JSON 文件的形式下载到用户系统中。 JSON 文件中的数据是将在我们的应用程序中使用的凭据。
- 授权将由我们将编写的代码执行。 Google 将日历存储在云中,我们的应用需要有权访问云存储的数据/资源。
- 每当我们访问日历方法时,服务帐户凭据和我们的方法调用将组合成一个请求(进行授权的 API 调用)并发送到 Google 授权服务器。该请求将由“客户端”通过使用 Google 的客户端库或直接通过 HTTP/REST 传递。
- 在我们的项目中,我们将通过声明 JWT 客户端来通过 HTTP 发送。然后服务器将返回一个访问令牌。我们的应用程序将使用此访问令牌来更改日历。
- 下一步是在Google日历网站上创建一个新日历(在文章中进一步提到),并将服务帐户电子邮件添加为有权更改日历的用户。
- 最后,我们使用 Express 创建我们的 NodeJS 应用程序,我们将安装“ googleapis ”(用于访问 Google API 的 NodeJS 客户端库)包。
- 我们将使用calendar.events调用对日历执行 2 个操作:
- View events for current date
- Add new event
现在让我们从上述方法的步骤实现开始。
首先,我们将看到在 Google Developers Console 中设置项目和凭据。
第 1 步:打开 google 控制台并单击下拉菜单以选择项目。我们将创建一个新项目。点击右上角的“新项目”。给一个合适的项目名称,然后单击创建。
第 2 步:创建项目后将显示 Google 控制台仪表板。确保您正在查看新创建项目的仪表板以添加 Google 日历功能。
第 3 步:单击左侧“更多产品”部分下方的 API 和服务选项卡,然后单击“启用 API 和服务”。
第 4 步:将显示 API 库。从这里我们可以选择我们想要为我们的项目启用哪些 API。由于我们要集成谷歌日历,在搜索框中输入“日历”并选择“谷歌日历 API”。
第 5 步:将显示 Google 日历 API 的所有详细信息,包括 API 的文档和服务。单击启用以将此 API 添加到您的项目中。
第 6 步:现在我们将为我们的应用程序创建服务帐户。单击“创建凭据”以创建服务帐户。
第 7 步:选择“Google Calendar API”作为凭证的 API 类型。
第 8 步:现在您将被询问“您将访问哪些数据?”,当我们创建服务帐户时,单击“应用程序数据”和“下一步”。
第 9 步:接下来输入服务帐户详细信息,例如帐户名称和服务帐户 ID,将同时生成。然后点击“创建并继续”。
第 10 步:我们将选择“Owner”角色,以便为我们的应用程序授予对服务帐户的访问权限。添加角色后,单击继续。
第 11 步:此步骤是可选的。您可以向可以管理服务帐户的特定人员或一组人员授予管理员权限。单击完成。
第 12 步:已设置服务帐户。现在必须创建此服务帐户的凭据。与此服务帐户关联的密钥可以作为 JSON 文件下载。我们将在后面的步骤中将此称为“服务密钥文件”。单击服务帐户下的电子邮件。
第 13 步:转到 KEYS 选项卡,然后单击 ADD KEY。
第 14 步:我们将创建一个新密钥并选择 JSON 作为密钥类型。点击创建。
第 15 步:创建私钥并将其下载为 JSON 文件。请记住,此文件高度敏感,其凭据不得公开!
第 16 步:我们仍然需要项目编号才能配置日历。单击右上角的 3 点菜单选项,然后单击“项目设置”。
第 17 步:复制项目编号并将其存放在安全的地方以备将来使用。
第 18 步:现在我们将设置一个 Google 日历并检索其 ID。日历将需要我们在 JSON 文件中获得的凭据。转到 Google 日历并通过单击“其他日历”旁边的“+”来创建一个新日历。
第 19 步:输入名称和描述,然后单击“创建日历”。
第 20 步:单击新创建的日历旁边的 3 点菜单,然后单击“设置和共享”。
第 21 步:向下滚动到“集成日历”部分并复制日历 ID。将此 ID 保存在安全的地方以备将来使用。打开 JSON 服务密钥文件并复制“客户端电子邮件”。通过粘贴复制的客户电子邮件,转到“与特定人员共享”部分和“添加人员”。
现在我们将设置 Express Application。
步骤 1:创建一个具有合适名称的新文件夹。我们将使用“Google_Calendar”。
第 2 步:在终端上运行以下命令:
npm init -y
npm i express googleapis
项目结构:它将如下所示。
第 3 步:创建一个 index.js 文件。这将是我们将集成 Google 日历的主要文件。首先,我们将查看事件。在这个文件中,逻辑顺序是:
- 需要必要的软件包,例如 express 和 googleapis。
- 从 JSON“服务密钥文件”声明所有必要的凭据,例如私钥、客户端电子邮件等。
- 使用我们在前面步骤中获得的项目编号和日历 ID 。
- 使用凭据声明 JWT(JSON Web 令牌)客户端。此 JWT 客户端将使用服务帐户凭据向 Google 服务器验证我们的应用程序。
- SCOPE 定义了与使用 JWT 客户端的 API 调用关联的授权级别。由于我们将首先显示即将发生的事件,因此 SCOPE 是“只读的”。
- JWT 客户端将用于向 Google 服务器发出请求。
- Google 服务器将返回一个访问令牌。
- 此访问令牌将用于调用 Google API。
- 使用项目编号和 JWT 客户端定义日历对象。
- 声明回家路线,它将显示添加到日历中的 10 个即将发生的事件,这些事件按其开始时间排序。如果没有为未来或当前日期安排的活动,则将显示“未找到即将发生的活动”。
- 事件由 calendar.events.list 访问。此调用返回的结果将使用 JSON.stringify 返回给浏览器。
在index.js文件中插入以下代码:
index.js
可以从 JSON 文件中获取私钥、客户端电子邮件。您之前存储的日历 ID 和项目编号将在此处使用。
运行应用程序的步骤:
node index.js
or
nodemon index.js
输出:可以使用以下链接在浏览器上查看输出: http://localhost:3000/
此路线将在日历上显示 10 个即将发生的事件,如果未添加任何事件,则显示“未找到即将发生的事件”。
由于这是一个新创建的日历,因此没有即将发生的事件。
第 4 步:插入新事件。 Google 提供了不同的方法来管理和控制添加到日历中的事件。我们可以使用calendar.events.insert()方法添加新事件。我们必须对在设置 Google 日历的第 6 步中添加的用户角色进行一些更改。返回“与特定人员共享”部分,将服务帐户的角色从“查看所有事件详细信息”更改为“更改事件”。
第 5 步:由于我们现在要编辑事件,因此我们的应用程序需要作为服务帐户进行身份验证。对于这种类型,在命令提示符(项目的根目录)中的以下内容并代替 KEY_PATH,放置 JSON 服务密钥文件的整个路径。
set GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
第 6 步:在index.js中创建用于添加事件(/createEvent)的新路由。为简单起见,我们将对事件的详细信息进行硬编码。根据 Calendar API 的文档,事件对象可以定义为:
Javascript
//A sample event object for calendar
var event = {
'summary': 'My first event!',
'location': 'Hyderabad,India',
'description': 'First event with nodeJS!',
'start': {
'dateTime': '2022-01-12T09:00:00-07:00',
'timeZone': 'Asia/Dhaka',
},
'end': {
'dateTime': '2022-01-14T17:00:00-07:00',
'timeZone': 'Asia/Dhaka',
},
'attendees': [],
'reminders': {
'useDefault': false,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10},
],
},
};
Javascript
//Creating an aunthenticated client to call events.insert()
const auth = new google.auth.GoogleAuth({
keyFile: '',
scopes: 'https://www.googleapis.com/auth/calendar', //full access to edit calendar
});
auth.getClient().then(a=>{
calendar.events.insert({
auth:a,
calendarId: GOOGLE_CALENDAR_ID,
resource: event,
}, function(err, event) {
if (err) {
console.log('There was an error contacting the Calendar service: ' + err);
return;
}
console.log('Event created: %s', event.data);
res.jsonp("Event successfully created!");
});
})
您可以根据自己的选择给出自己的日期、时间、位置、描述值。
第 7 步: JWT 客户端为 API 调用定义了一个“只读”范围。但是,如果我们想添加新事件,“只读”范围是不够的。
- 因此,现在让我们声明另一个客户端“auth”,其中包含用于身份验证的凭据,例如 JSON 服务密钥文件的路径和授权范围为“ https://www.googleapis.com/auth/calendar ”,以完全访问 Google 日历API。
- auth 客户端将执行类似于 JWT 客户端从 Google 身份验证服务器请求访问令牌以进行 API 调用的后台过程。
以下是声明“auth”客户端的代码:
Javascript
//Creating an aunthenticated client to call events.insert()
const auth = new google.auth.GoogleAuth({
keyFile: '',
scopes: 'https://www.googleapis.com/auth/calendar', //full access to edit calendar
});
auth.getClient().then(a=>{
calendar.events.insert({
auth:a,
calendarId: GOOGLE_CALENDAR_ID,
resource: event,
}, function(err, event) {
if (err) {
console.log('There was an error contacting the Calendar service: ' + err);
return;
}
console.log('Event created: %s', event.data);
res.jsonp("Event successfully created!");
});
})
现在检查事件已创建。打开浏览器并转到http://localhost:3000/createEvent。
输出:
将显示以下输出
现在您还记得,之前在输出部分中,显示了“没有即将发生的事件”。现在再次访问 http://localhost:3000/。将显示您新创建的活动详情!
进入谷歌日历,您还可以看到那里添加的新创建的活动。
最终输出: